在shell 脚本中执行命令,是以“阻塞”方式执行的,这点类似于 system 系统调用,之前并没有意识到这一点,为此,犯错了。
这是一个监控脚本,功能是检查一个程序(以下记做:daemonp)是否在运行(按“程序名”检测),如果不在,则启动它。代码也很简单,在一个死循环中,grep ps 的结果,如果结果为空,则启动daemonp。脚本是别人写的,循环中有sleep 1命令(其实这个sleep没用)。我臆断为每1s检查一次。事实是:脚本检查到daemonp没有运行,则启动它,这时脚本阻塞在 daemonp 的运行上,直到 daemonp 运行结束(挂掉也算)。如果 daemonp 挂了,则脚本继续执行,然后再次检查到daemonp 不存在,启动,阻塞,······,周而复始。
这个脚本运行很好,但是如果用它监控多个程序,就有问题了(假设还监控daemonq)。假设daemonp 和 daemonq 都没有运行,并假设先检测到 daemonp 没有运行,然后启动,现在脚本阻塞到 daemonp 的调用上,没有可能启动 daemonq 了。
解决办法是把 daemonp 和 daemonq 放到后台运行,没有阻塞了,这时 sleep 1 才有用。脚本每1s检查一次。
把命令放到后台的方式是命令后加“&”,但是如果把命令放到变量中(假设为CMD),用``执行,放到后台的方式是`$CMD` &
分享到:
0