時には次のようなことをしたいときがあります。
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)が与えられて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>