当进程完成时做某事

当进程完成时做某事

有时当我想做这样的事情时:

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>

相关内容