回答:
次のようなことができます。これにより、プロセスが5秒ごとに実行されているかどうかが確認され、適切なアクションが実行されます。
while true; do
if ps -ef | grep -q '[l]ong-running-process'; then
sleep 5
else
sudo poweroff
fi
done
grep
式の角括弧に注意してください。これはgrep
、ps
リストに含まれるプロセスが一致しないようにするためです。単一の文字を角括弧で囲むだけで十分です。
私はいつもこれをしています。
&&
命令をするのを忘れたことに気づく。fg && shutdown -h now
先:
または、次のような他の回答で提案されているようにポーリングすることもできます。
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
pidがわかっている場合、これを実行できます。
while ps -p $PID; sleep 5; done; shutdown -h now
psからエコーなしで実行するには、次のようにします。
while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now
最後に、出力なしでバックグラウンドで実行します。
(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &
スコットのソリューションは優れたソリューションですが、これにより、grep
既にpidを知っている場合は何度も繰り返す必要がなくなります。また、入力する方がはるかに高速です。
&&
前のコマンドが成功した場合にのみ実行されることを理解してください。コマンドが失敗した場合でも実行する場合は、;
代わりに使用します。