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

Chaining Bash command with double ampersand - unexpected behavior

以下效果很好

> killall httpd

> service httpd start
Starting httpd:                 [  OK  ]

> service httpd status
httpd (pid  2987) is running...

下面的应该像上面一样工作,但它不是

> killall httpd && service httpd start
Starting httpd:

> service httpd status
httpd is stopped

注意这里没有return启动httpd的[OK]信号。

出了什么问题?通过异步链接 运行 执行 Bash 命令吗?我怎样才能确保它们 运行 一个 在另一个 之后同步?

在这种情况下,我认为您应该使用分号而不是双符号。 我不认为 killall 命令总能为您尝试执行的操作发出适当的信号。 当然,如果没有 运行 个 httpd 任务,它将失败。

问题是信号(killall)是异步的。

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

在您的交互式案例中,在您发出下一个命令之前的第二次长时间延迟足以让进程关闭。因此再次启动它是有效的。

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

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

killall httpd --wait && service httpd start

这确保了 killall 完成了所有 httpd 服务的杀戮,然后 然后才 继续启动新的 httpd 服务。

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