プロセスが完了/終了したときにアラートを受け取ることに関して、ここにはいくつかの質問と回答があります( 1 、 2 )–これらはすべて、ユーザーが発行したことを前提としています自身を処理するため、管理スクリプトに組み込まれたアラートでスクリプトを作成したり、プロセスを何らかのアラートにパイプしたりできます。
私の状況では、ユーザーが初期化していないプロセスの完了/終了について警告を受けたいと思います。つまり、Ubuntu 12.04 LTSサーバーで大量のビデオファイルを一括処理しています。これらのファイルの特定の操作には非常に長い時間がかかるため、特定のファイルが終了したときに何らかのアラート(メールは素晴らしい)が欲しいです。彼らはとても時間がかかるので、PITに基づいて手動でこれを1回きりで行うことは完全にうまくいくでしょう。
より詳細な情報を提供するために、特に大きなファイルを処理しているとしましょう。FFMPEGスクリプトに進み、プロセス自体はpythonスクリプトです)(かなり複雑です) 、自分で記述したものではなく、変更したくないもの–これは最初の論理的なアプローチです。上記の実行中のPIDでコマンドまたはスクリプトを発行することを想像しますpythonスクリプト引数として、そのPIDを持つプロセスが実行されなくなったときに、アラートスクリプトが処理を実行します。
何か案は?
私は process_watcher.py と書きました
process_watcher --pid 1234 --to [email protected]
現在、メール本文は次のようになっています。
PID 18851:/usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
開始:3月10日木曜日18:33:37終了:3月10日木曜日18:34:26(期間0:00:49)
メモリ(現在/ピーク)-常駐:155,280/155,304 kB仮想:1,166,968/1,188,216 kB
[+] indicates the argument may be specified multiple times, for example:
process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to [email protected] --to [email protected]
optional arguments:
-h, --help show this help message and exit
-p PID, --pid PID process ID(s) to watch [+]
-c COMMAND_PATTERN, --command COMMAND_PATTERN
watch all processes matching the command name. (RegEx pattern) [+]
-w, --watch-new watch for new processes that match --command. (run forever)
--to EMAIL_ADDRESS email address to send to [+]
-n, --notify send DBUS Desktop notification
-i SECONDS, --interval SECONDS
how often to check on processes. (default: 15.0 seconds)
-q, --quiet don't print anything to stdout
改善が必要な場合は、GitHubの問題を停止してください。
このようなもの?
(while kill -0 $pid; do sleep 1; done) && echo "finished"
置換$pid
プロセスIDとecho "finished"
プロセスが終了したときに何をしたいか。
例えば:
(while kill -0 $pid; do sleep 1; done) && mail ...
私が使う &&
最初のコマンドが正常に終了したときに2番目のコマンドを実行します。ここにいくつかの例があります:
大きなフォルダとビープ音を削除します。
rm -rv ~/tmp && beep
カーネルをコンパイルしてメールを送信します。
make && mail -s "Compilation is done" [email protected]
これはあなたの問題を解決する良い方法ですか?別のケースでは、||
と、失敗した場合の3番目のコマンド。
また、シェルスクリプトは exit status ($?
)あなたのコマンド、そしてif/else
とループを使用すると、好きなようにできます。
Pidがない場合は、ffmpegのすべてのインスタンスが完了するまで実行されます。
(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
ポーリングオプションまたは外部スクリプトを使用したくない場合で、長時間実行プロセスを既に開始している場合は、CTRL + Zで一時停止してから、fg
(プロセスをフォアグラウンドに移動します)。
例えば:
my_command # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'