以下效果很好
[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
请注意,此处它没有返回[OK]
信号以启动httpd。
出了什么问题?
通过&符号链接的Bash命令是否异步运行?
如何确保它们在另一个之后同步运行
答案 0 :(得分:3)
问题是信令(killall
)是异步的。
在非交互式情况下,当您要求服务器启动时服务器仍在运行,因为它没有时间退出。
在交互式情况下,发出下一个命令之前的第二个长延迟足以允许进程关闭。因此再次启动它。
正确的解决方案是service httpd restart
,它们都会杀死并启动服务器。
答案 1 :(得分:1)
在这种情况下,我认为你应该使用分号而不是双号&符号。 我不认为killall命令始终适合你正在尝试做的事情。 当然,如果没有正在运行的httpd任务,它将失败。
答案 2 :(得分:1)
--wait
转换在这种情况下很重要(但是,稍后会说明更好的解决方案。)
killall httpd --wait && service httpd start
这确保了killall完成了所有httpd服务的杀戮, 只有 继续开始新的httpd服务。
但是,我还了解到,在这种情况下,只需执行 service httpd restart
就可以比杀死所有httpd并启动新的httpd更好。