Help us understand the problem. What is going on with this article?

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

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

同じシェル内のバックグラウンドプロセスなら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つ目の方法を使ってください。

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

exy81
しばらくZennとQiitaに同じ記事を投稿します。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away