使用双符号链接 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 更好。
以下效果很好
> 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 更好。