昨天客户现场的一台机器不知道什么原因突然down掉了,然后重启的时候一直报httpd(pid 6062) alaready running
但是使用ps -ef|grep httpd 根本没有没有看到有相关的服务
再看看ps -ef|grep 6062
这个pid真的有进程在使用,但是这个并不是Apache的服务进程,尝试使用kill命令去把这个进程杀死,然而并没有什么作用,这个进程刚好也是不能被强制杀死
搞到这里也没有头绪了,再加上已经是晚上11点了,就滚回家洗洗睡了;
今天早上过来的时候现场的同事反映说问题解决了,不能重启的原因是pid被锁定了,看到这里,我突然灵光一闪,想起昨晚的都是使用service httpd restart这个命令来重启Apache的服务,会不会是这个restart命令不会变动pid呢,于是马上验证:
果然跟猜想的一样!!!最后在一篇博客上看到这么一段话:
apache在调用restart的时候,先去读取httpd.pid文件中先前进程的pid值,并向其发送一个SIGNALHUP信号,而启动意外挂掉重启,没有执行stop指令,pid文件没有被移除,于是再次调用restart的时候,会认为该进程pid号是存在的,仍然会发送一个SIGNALHUP信号给该进程号。由于系统刚启动,恰巧这个进程号已经被新的进程占用了,而apache发送的这个HUP信号,发送给了另外的新进程,导致系统出现了异常,被挂起。
好吧,又涨姿势了,下次遇到这样的问题就可以解决了!