17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

プロセスの終了を待機してコマンドを実行する方法

Last updated at Posted at 2017-07-13

シミュレーションが終わるのを待って次のシミュレーションを回したり、メールをとばしたりするために、
特定のプロセスが終了するのを検知する方法です。

同じシェル内のバックグラウンドプロセスならwaitコマンドが使えますが、
別シェルのプロセスを監視する場合は他の方法が必要です。

ループを使う方法

while ps -p XXXX > /dev/null; do sleep 60; done; echo "end"

XXXXは監視するプロセスのPID。

原理としては無限ループを回しておいて、プロセスが終了したらループを抜けるようにしています。
psコマンドの-pオプションでプロセスを指定すると、プロセスがあれば、終了ステータスが0で終わり、ループが続きます。
プロセスがなければ(監視しているプロセスが終了していれば)ループを抜けて次のコマンドが実行されます。

tailコマンドを使う方法

コメント欄で別のやり方も教えていただきました。

tail -f /dev/null --pid=XXXX; echo "end"

--pidオプションが指定されたPIDのプロセスが終了した時点でtailコマンドも終了することを利用しています。

※こちらはGNU系のtailが必要です。
Linuxは問題なく使えますが、macOSなどのBSD系のtailでは--pidオプションがないため、1つ目の方法を使ってください。

また、この方法は指定したプロセスが標準出力をファイル等にリダイレクトしている場合はうまく動作しなさそうです。

17
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?