1.错误信息描述

在重庆万州进行设备巡检时,发现CCS01A(HP UNIX B.11.31)服务器终端窗口频繁弹出报错,查看dmesg输出信息和OLDsyslog.log全是该报错以及/var分区满了的信息,但是syslog.log在很久之前就没有再被写入内容,是空文件。

# 终端窗口频繁出现的报错信息
esmd: System Error: The EVM daemon has failed and cannot be restarted

mark

2.syslog.log为空文件的问题解决办法

重启syslogd服务后解决,esmd: System Error: The EVM daemon has failed and cannot be restarted等相关报错信息开始写入日志文件。

3.evm daemon频繁报错解决办法

Event Management ( EVM )

在正常的服务器上执行命令:

ps -ef | grep evm*

可以得到以下结果,但是CCS01A(报错服务器)上没有任何关于evm的进程:

mark

手动执行命令启动evmd进程:

/usr/sbin/evmd

再次查看CCS01A上该进程已经存在,服务器不再报错。

mark

但是类似正常服务器的evmlogger 和 evmchmgr 相关进程并没有启动,按照正常服务器进程显示的命令手动执行evmlogger 和 evmchmgr相关命令,服务器报错:

interpreter "/bin/sh" not found

和正常的服务器进行对比发现:正常的服务器上存在:/bin -> /usr/bin 的软链接,而CCS01A上没有,因此在CCS01A上新建软链接,并修改其属主和属组:

mark

ln -s /usr/bin /bin
chown -h bin:bin /bin

修改后,CCS01A evm相关服务正常启动,关闭evmd服务后服务器也可以立刻将其自动启动。

建议手动的开启关闭evmd服务的方法是(==其实正常情况下该服务只要被关闭就会立刻自动启动==):

evmstop
evmstart
也可以:
/sbin/init.d/evm stop
/sbin/init.d/evm start

4.纠结的排错过程记录

首先,在网上查找到的解决办法是:

if you have same issue you can try to  Copy evmstart and evmstop scripts from the good host. Then the issue is solved.

也就是说在将正常的服务器的evmstart和evmstop文件拷贝到报错的服务器上即可,可以使用如下命令查找这两个文件:

find / -name evmstart
find / -name evmstop

首先将CCS01A服务器的原文件进行备份,然后将正常的文件拷贝至CCS01A,注意修改文件的属主属组和权限。

mark

但是我发现拷贝正确的文件后CCS01A仍然会报错,于是在正常的服务器上查看evm相关的进程:

ps -ef | grep evm*

发现正常服务器上有进程:/usr/sbin/evmd 进程,而CCS01A上没有,于是在CCS01A上将该进程开启,执行命令:

/usr/sbin/evmd

再次查看CCS01A上该进程已经存在,服务器不再报错,然后搜索了evmd服务的开启及关闭方法,如下:

# HP UNIX 重启evmd服务的方法:
# 方法一:
•/sbin/init.d/evm stop
•/sbin/init.d/evm start
# 方法二(方法一应该是是正规做法):
•杀死evmd进程 kill -9 PID
•执行命令/usr/sbin/evmd
# 方法三(该方法是从/sbin/init.d/evm脚本中看到的):
•evmstop
•evmstart

本以为这样就彻底解决了问题,心血来潮决定重启一下evmd 服务试试,结果再次频繁发生报错,并且使用/sbin/init.d/evm start命令无法启动evmd服务,重启过程见下图:

mark

mark

于是查看/sbin/init.d/evm 文件,发现该脚本建议使用evmstart 和evmstop 来手动开启关闭evmd服务,并且该脚本也是调用的这两个命令,于是执行evmstart 来开启evmd服务,结果还是报错:

mark

报错中提示/bin/sh 找不到,查看evmstart 脚本,发现其开头指定的命令解释器为:#!/bin/sh.在终端窗口执行命令: which sh 得出的结果却是:/usr/bin/sh,其他正常的服务器都是:/bin/sh

这里开始主观的认为正常的服务器sh命令是在/bin/sh目录下,而报错的CCS01A则由于未知原因导致sh在/usr/bin目录下

于是把/usr/sbin目录下evm*相关的脚本开头的命令解释器都修改为:#!/usr/bin/sh,再次执行evmstart 后,evmd服务正常启动,对其进行重启:

evmstop
evmstart
或者
/sbin/init.d/evm stop 
/sbin/init.d/evm start

系统不再报错,其实关闭该服务后,系统会很快自动将其开启,无需手动开启evmd服务。见下图:

mark

最后和正常的服务器进行对比,又发现CCS01A上关于evm的进程比较少,正常服务器进程如下:

mark

于是按照正常服务器进程显示的命令手动执行evmlogger 和 evmchmgr相关命令,服务器报错:

interpreter "/bin/sh" not found

和正常的服务器进行对比发现:正常的服务器上存在:/bin -> /usr/bin 的软链接,而CCS01A上没有,因此在CCS01A上新建软链接,并修改其属主和属组:

mark

# 新建软链接
ln -s /usr/bin /bin
chown -h bin:bin /bin

修改后,CCS01A evm相关服务正常启动,关闭evmd服务后服务器也可以立刻将其自动启动。至此该错误成功解决。

5.其他问题说明

关于命令解释器的路径问题:

在CCS01A终端窗口执行命令: which sh    
得出的结果却是:/usr/bin/sh,其他正常的服务器都是:/bin/sh

可以用which命令显示系统命令路径的顺序来解释:

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

在CCS01A创建完软链接后,只需要修改当前的PATH变量即可使其和其他服务器显示的路径一致:

PATH=/bin:$PATH

为避免有其他影响,本次未对CCS01A进行PATH变量修改。

在网上索搜到的另外一种解决办法如下,但是实验后并没有解决问题,现在也将这种方法列出,仅供参考:

Hello freinds,
Above mentioned problem is solved.
Problem was solved by this way - Ensure that there is softlink between / directory to the directory which contains evmstop and evmstop script files.
Command i used is
ln -s /usr/bin2 /
Thanks for your support.