別のユーザーがbunzipプロセスを開始し、そのbunzipの完了後に実行を開始したいスクリプトがあるとします。スクリプト内からbunzipプロセスが終了したことを確認する最良の方法は何ですか? pidを指定したps
の呼び出し? pgrep bunzip?スクリプトを実行できるかどうかを確認するために5分ごとにチェックするcrontabにスクリプトを投入するとします。また、bunzipは1時間以上実行されており、完了するまでに1時間かかる可能性があるため、bunzipを停止したくないものとします。
私の最初の反応は次のようなものを使用することです
if `ps -p 12938`
# bunzip is done, execute the code
fi
# exit
しかし、もっと良い方法があるかどうか疑問に思っています。また、私はcross-unix ps -pidがどのくらいかわかりません。
ps -p $pid
は [〜#〜] posix [〜#〜] であり、最新の非組み込みunixで機能する必要があります( antiques または Minixではありません) または BusyBox )。
特定のPIDによるプロセスがあるかどうかをテストする簡単で移植可能な方法は、kill -0 $pid
です。これは、シグナルをプロセスに送信できる場合にのみ機能します(シグナル0は常に配信されるが効果がないシグナルのように動作します)。つまり、kill
がプロセスの実効UIDで実行されているか、ルートとして実行されています。 kill
が別のユーザーとして実行されている場合は、「そのようなプロセスがない」(ESRCH)か「操作は許可されていません」(EPERM)のどちらであるかをテストできますが、シェルからは実装のフォーマット方法を知る必要がありますエラーメッセージ。
あなたの提案された設計には大きな欠陥があります:そのPIDがあなたが待っていたbunzipプロセスであるかどうかをどうやって知るのですか?たぶんbunzipが終了し、古いPIDを持つ別のプロセスができました。プロセスの終了を確実に待機できる唯一の場所は、その親です。
より良いアプローチは、非圧縮ファイルの存在と圧縮ファイルの非存在のいずれかでトリガーするか、または非圧縮ファイルが(lsof
を使用して)プロセスによって開かれていないことを確認することです。
Psの使用には何の問題もありませんが、これは代替手段です
if [ -e /proc/${PID} -a /proc/${PID}/exe ]
% process active
else
% process no longer active
fi
いくつかの選択肢があります。
これらのどれも、本当にばかであるか、きれいではありません。
最も簡単な方法は、ユーザーの手を離れて、解凍を実行してからコードを実行するスクリプトを記述することです。
これが不可能な場合は、ファイルの解凍中にディスク上にpidファイルを作成するスクリプトを作成するようにユーザーに依頼してください。その後、PIDファイルを検索できます。