有时当我想做这样的事情时:
long_running_command; second_command
我忘记了那; second_command
部分。如果我不想中断并重新启动long_running_command
(有时这是不可能的,其他时候在我发现我的错误之前它已经运行了很长时间并且工作将被浪费),我通常会做类似的事情
ps aux | grep long_running_command
while (kill -0 <pid found above>); do sleep 1; done; second_command
(在另一个终端中)
当它工作时,会导致以下错误:
kill: kill <pid> failed: no such process
有没有办法避免该错误,或者有更好的方法在完成second_command
后立即安排long_running_command
。
(我zsh
在 Debian Jessie 上使用)。
答案1
给定 Debian (Linux),并假设只有一个long_running_command
:
while [ -d /proc/$(pgrep -f 'long_running_command') ]; do sleep 0.1; done; second_command
或者,如果您知道 PID:
while [ -d /proc/PID-HERE ]; do sleep 0.1; done; second_command
如果是常见情况:
waitrun() {
while [ -d /proc/$1 ]; do sleep 0.1; done;
shift
"$@"
}
waitrun PIDHERE second_command
答案2
尝试使用 zsh shell 的内置wait
命令 - 它会为您完成这项工作。
% date; sleep 30s &
Tue Aug 8 22:24:07 EDT 2017
[1] 31875
% wait %1; date
[1] + done sleep 30s
Tue Aug 8 22:24:37 EDT 2017
您还可以使用 PID 而不是上面的作业规范。所以,:
% date; sleep 30s &
Tue Aug 8 22:26:04 EDT 2017
[1] 1821
% wait 1821; date
[1] + done sleep 30s
Tue Aug 8 22:26:34 EDT 2017
bash 上的语义也是相同的。
答案3
这段代码应该可以做到这一点。如果未找到命令,则循环中断并执行第二个命令。
while [ -n "$(pgrep <executed command>)" ]; do sleep 0.1; done; <second command>