実行中のプロセスが終了したときに警告する


21

そこここにいくつかの質問と回答は、ときに、プロセスが完了/終了(警告さに関してある12) -これらは、すべてのユーザーが発行したと仮定に組み込まれた警告とそれをプロセスそのものを言っので、缶スクリプトスクリプトを管理するか、プロセスを何らかのアラートにパイプします。

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

より多くの情報を提供するために-私は特に大きなファイルを処理していて、それがFFMPEGスクリプトに進んでいるとしましょう、プロセス自体はPythonスクリプトです(それは非常に複雑で、自分で書かれていません私は修正したくない-それが最初の論理的アプローチだろうが。実行中のpythonスクリプトのPIDを引数としてコマンドまたはスクリプトを発行し、そのPIDのプロセスが実行されなくなると、アラートスクリプトがその処理を実行することを想像します。

何か案は?


monitmmonit.com/monit/documentation)は潜在的なオプションのように見えますが、必要なものよりもはるかに複雑です。 。
ドングル

回答:


9

process_watcher.pyを書きました

process_watcher --pid 1234 --to me@gmail.com

現在、メールの本文は次のようになっています。

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 person1@domain.com --to person2@someplace.com

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の問題を解決してください。


23

このようなもの?

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

$pidプロセスIDとecho "finished"、プロセスが終了したときに行うことで置き換えます。

例えば:

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

驚異的!魔法のように機能します。
ドングル

1
マイナーな(そしておそらく明白な)注意–プロセスがユーザーによって所有されていない場合、killをsudoする必要があります。
ドングル

1
@dongle、私のRHELボックス上に少なくとも、kill -0報告書No such processは存在しないのPID用およびOperation not permittedので、おそらくの必要性未然に防ぐ必要がありますエラーメッセージを解釈し、別のユーザーが所有するPIDのためのsudo
iruvar

1
エコーしている場合は、常にを実行できますecho -en "\007 \007 \007"。これにより、ターミナルの「ベル」が発行されます。それが実際の可聴音に変換されるかどうかは、端末とハードウェアに依存します(ただし、通常はそうです)。
モルゴン14

5

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

  1. 大きなフォルダーを削除してビープ音を鳴らす:

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

    make && mail -s "Compilation is done" user@yourmaildomain.com

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

また、シェルスクリプトはコマンドの終了ステータス$?)を受け取り、with if/elseとloopsで何でも好きなことができます。


ウィリアンに感謝しますが、私が言ったように、私のユースケースの特定の課題は、これが私が発行しているコマンドではなく、すでに実行中のプロセスであるということです。したがって、&&はオプションではありません。とにかくありがとう。
ドングル14

4

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

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

0

ポーリングオプションや外部スクリプトを使用したくない場合で、長時間実行プロセスを既に開始している場合は、CTRL + Z(SIGTSTPシグナルを送信)で一時停止してfgから(プロセスを前景)。

例えば:

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

を除いて...「私の状況は、ユーザーが初期化していないプロセスの完了/終了について警告を受けたいということです。」
Jeff Schaller

-1

プロセスの終了時にAndroidスマートフォンに通知を送信するアプリを作成したので、コンピューターに接続する必要はありません。

インストールして;notifier.shから、コマンドの最後に追加します。

たとえば、コマンドがの場合、コマンドmake installを作成します。

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier


「…しかし、これらはすべて、ユーザーが自分でプロセスを発行したことを前提としているため、管理スクリプトに組み込まれたアラートでスクリプトを作成したり、プロセスを何らかのアラートにパイプしたりできます。/私の状況は、ユーザーが初期化していないプロセスの完了/終了について警告を受けたいということです。」
G-Manは、「Reinstate Monica」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.