最近看了一个问题,有同事在 suse环境下的/etc/init.d/boot.local 中,增加了一行脚本。
该脚本的简单大意如下:
#!/bin/bash while [ 1 ] do if [ $(ps -ef |grep -i java|grep -v grep|wc -l) -gt 0 ] then echo "find java process" break; else echo "can't find process" sleep 2 continue; fi done
本来应该是最终走分支if的,但是运行发现,该脚本在java运行之后,也没能退出。
手工执行该脚本,也能正常退出,不会一直循环,那是什么原因导致的脚本不退出呢?
唯一的可能就是if条件不满足。
最后发现,要是条件判断满足,前提是,正常的runlevel,因为/etc/init.d/boot.local 这个脚本是由 /etc/init.d/boot 这个script 所启动的,而且是最后 boot script 工作完成要准备进入 runlevel 环境执行各项 rc script 前所执行。而 rh 的 /etc/rc.d/rc.local 脚本是 runlevel 环境执行各项 rc script 時最后一个阶段所执行的。
所以,哪怕最后进入了正常的runlevl,但是该脚本的运行环境中,ps -ef 和我们手工执行看到的ps -ef 是不一致的。