以下效果很好
[root]# killall httpd
[root]# service httpd start
Starting httpd: [ OK ]
[root]# service httpd status
httpd (pid 2987) is running...
以下应该像上面那样工作,但事实并非如此
[root]# killall httpd && service httpd start
Starting httpd:
[root]# service httpd status
httpd is stopped
请注意,这里没有返回启动httpd的[OK]
信号。
出了什么问题?
通过&符链接执行Bash命令是否异步运行?
我怎样才能确保它们一个接一个地同步运行?
问题是信令(使用killall
)是异步的。
在非交互式情况下,当您要求服务器启动时,服务器仍在运行,因为它没有时间退出。
在交互式情况下,发出下一个命令之前的第二个长延迟足以允许进程关闭。因此再次启动它是有效的。
正确的解决方案是service httpd restart
,它杀死并启动服务器。
在这种情况下,我认为你应该使用分号而不是双符号。我不认为killall命令始终适合你正在尝试做的事情。当然,如果没有运行的httpd任务,它将失败。
在这种情况下,--wait
开关非常重要(但是,稍后会说明更好的解决方案。)
killall httpd --wait && service httpd start
这确保了killall完成了所有httpd服务的杀戮,并且只能继续开始新的httpd服务。
但是,我也了解到,在这种情况下,简单地执行service httpd restart
会比杀死所有httpd和启动新的httpd更好。