他のユーザーがBunzipプロセスを開始し、Bunzipが完了した後に実行を開始したいスクリプトがあるとします。スクリプト内でBunzipプロセスが完了したことを確認するための最良の方法は何ですか?ps
指定されたPIDに電話しますか? pgrepパッケージ?スクリプトをcrontabに入れて、5分ごとに実行可能であることを確認するとします。また、bunzipが1時間以上実行されており、完了するのに1時間以上かかることがあるため、停止したくないとします。
私の最初の本能は、次のようなものを使用することでした。
if `ps -p 12938`
# bunzip is done, execute the code
fi
# exit
しかし、より良い方法があるかどうか疑問に思います。また、Unixではps -pidがどのように機能するのかわかりません。
ベストアンサー1
あなたの明らかな質問: 与えられたPIDのプロセスがあるかどうかテストしなさい。
ps -p $pid
はいPOSIXそして、組み込まれていない最新のUNIXで動作する必要があります。古代美術またはミニクスまたは忙しい箱)。
与えられたPIDのプロセスが存在するかどうかをテストする簡単で移植可能な方法はですkill -0 $pid
。これはプロセスに信号を送信できる場合にのみ機能します(信号0は常に転送されますが、効果はありません)。つまり、プロセスがkill
プロセスの有効なUIDまたはルートとして実行されていることを意味します。他のユーザーとして実行している場合は、kill
「該当するプロセスなし」(ESRCH)または「操作が許可されていません」(EPERM)信号を送信するかどうかをテストできますが、シェルでこれを行うには、実装がエラー情報の形式をどのように指定するかを知る必要があります。 。
基本設計:プロセスが完了したかテスト
提案されたデザインには1つの主な欠陥があります。そのPIDが待っているBunzipプロセスであるかどうかはどうすればわかりますか?おそらくbunzipが完了し、古いPIDを使用する別のプロセスがあります。プロセスが終了するまで確実に待機できる唯一の場所は親プロセスです。
より良いアプローチは、圧縮されていないファイルの存在と圧縮されたファイルの不在をトリガーするか、圧縮されていないファイルがlsof
プロセスで開かれていない(使用されていない)ことを確認することです。