プロセスが完了したら何かをしてください

プロセスが完了したら何かをしてください

時には次のようなことをしたいときがあります。

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

(私はzshDebian Jessieを使っています)。

答え1

Debian(Linux)が与えられて1つしかないとします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シェルに組み込まれている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

このコードはトリックを実行する必要があります。コマンドが見つからない場合、ループは中断され、2番目のコマンドが実行されます。

while [ -n "$(pgrep <executed command>)" ]; do sleep 0.1; done; <second command>

関連情報