使用双符号链接Bash命令 - 意外行为

时间:2015-04-18 17:20:24

标签: bash chaining ampersand

以下效果很好

[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命令是否异步运行?

如何确保它们在另一个之后同步运行

3 个答案:

答案 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更好。