web-dev-qa-db-ja.com

実行中のプロセスが完了したときにアラート

プロセスが完了/終了したときにアラートを受け取ることに関して、ここにはいくつかの質問と回答があります( 12 )–これらはすべて、ユーザーが発行したことを前提としています自身を処理するため、管理スクリプトに組み込まれたアラートでスクリプトを作成したり、プロセスを何らかのアラートにパイプしたりできます。

私の状況では、ユーザーが初期化していないプロセスの完了/終了について警告を受けたいと思います。つまり、Ubuntu 12.04 LTSサーバーで大量のビデオファイルを一括処理しています。これらのファイルの特定の操作には非常に長い時間がかかるため、特定のファイルが終了したときに何らかのアラート(メールは素晴らしい)が欲しいです。彼らはとても時間がかかるので、PITに基づいて手動でこれを1回きりで行うことは完全にうまくいくでしょう。

より詳細な情報を提供するために、特に大きなファイルを処理しているとしましょう。FFMPEGスクリプトに進み、プロセス自体はpythonスクリプトです)(かなり複雑です) 、自分で記述したものではなく、変更したくないもの–これは最初の論理的なアプローチです。上記の実行中のPIDでコマンドまたはスクリプトを発行することを想像しますpythonスクリプト引数として、そのPIDを持つプロセスが実行されなくなったときに、アラートスクリプトが処理を実行します。

何か案は?

22
dongle

私は 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の問題を停止してください。

10
Arlo

このようなもの?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

置換$pidプロセスIDとecho "finished"プロセスが終了したときに何をしたいか。

例えば:

(while kill -0 $pid; do sleep 1; done) && mail ...
24
chaos

私が使う &&最初のコマンドが正常に終了したときに2番目のコマンドを実行します。ここにいくつかの例があります:

  1. 大きなフォルダとビープ音を削除します。

    rm -rv ~/tmp && beep
    
  2. カーネルをコンパイルしてメールを送信します。

    make && mail -s "Compilation is done" [email protected]
    

これはあなたの問題を解決する良い方法ですか?別のケースでは、||と、失敗した場合の3番目のコマンド。

また、シェルスクリプトは exit status$?)あなたのコマンド、そしてif/elseとループを使用すると、好きなようにできます。

5
Willian Paixao

Pidがない場合は、ffmpegのすべてのインスタンスが完了するまで実行されます。

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
4
user82927

ポーリングオプションまたは外部スクリプトを使用したくない場合で、長時間実行プロセスを既に開始している場合は、CTRL + Zで一時停止してから、fg(プロセスをフォアグラウンドに移動します)。

例えば:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
0
Benjamin