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

问题描述 投票:2回答:3

以下效果很好

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

我怎样才能确保它们一个接一个地同步运行?

bash chaining ampersand
3个回答
3
投票

问题是信令(使用killall)是异步的。

在非交互式情况下,当您要求服务器启动时,服务器仍在运行,因为它没有时间退出。

在交互式情况下,发出下一个命令之前的第二个长延迟足以允许进程关闭。因此再次启动它是有效的。

正确的解决方案是service httpd restart,它杀死并启动服务器。


1
投票

在这种情况下,我认为你应该使用分号而不是双符号。我不认为killall命令始终适合你正在尝试做的事情。当然,如果没有运行的httpd任务,它将失败。


1
投票

在这种情况下,--wait开关非常重要(但是,稍后会说明更好的解决方案。)

killall httpd --wait && service httpd start

这确保了killall完成了所有httpd服务的杀戮,并且只能继续开始新的httpd服务。

但是,我也了解到,在这种情况下,简单地执行service httpd restart会比杀死所有httpd和启动新的httpd更好。

© www.soinside.com 2019 - 2024. All rights reserved.