web-dev-qa-db-ja.com

プロセスの終了時に通知メールを送信するプログラムはありますか?

私は計算科学者であり、Linuxで多くの時間のかかる計算を実行しています。具体的には、 GROMACSパッケージを使用して分子動力学(MD)シミュレーションを実行します。 これらのシミュレーションは、(たとえば)8〜24コアで実行する場合、数日または数週間かかる場合があります。クラスターのいくつかのノードにアクセスできます。つまり、常に4つまたは5つのジョブ(それぞれが異なるノードで、それぞれ8〜24コア)を実行しています。

問題は、シミュレーションにさまざまな時間がかかることです。すべてのノードが24時間体制でシミュレーションを実行できるようにしたいのですが、新しいシミュレーションを開始するには、ターミナルでログインし、手動で作業する必要があります。でも、シミュレーションの残り時間を忘れているので、常にチェックしている。

Linuxプロセスが終了したときに電子メールを受信する方法はありますか?これを行うLinuxプログラムはありますか?そうすれば、ターミナルにログインして次のシミュレーションを準備するタイミングがわかります。

Ubuntu Linuxを使用しています。御時間ありがとうございます。

47
Andrew

atデーモンに送信されたジョブは、完了時にstderrおよびstdoutから出力を送信します。ジョブに出力がない場合でもメールを送信するように構成することもできます。また、制御端末なしで実行できるという利点もあります。そのため、端末を閉じることがジョブに与える影響について心配する必要はありません。

例:

echo "/opt/product/bin/job.sh data123"|at -m NOW

このジョブが完了すると、ジョブを送信したユーザーにメールが送信され、出力がある場合はそれを受信します。 LOGNAME環境変数を変更することで、電子メールの受信者を変更できます。

atにはバッチモードがあり、システムがビジーでないときにジョブをキューに入れて実行できます。これは、複数のユーザーがリソースを求めて競合している場合は、あまり良いキューイングシステムではありませんが、それを使用してジョブを実行したい場合は、次のようになります。

echo "/opt/product/bin/job.sh dataA"|batch
echo "/opt/product/bin/job.sh dataB"|batch
echo "/opt/product/bin/job.sh dataC"|batch

デフォルトでは、システムの負荷が1.5未満でない限りジョブは開始されませんが、その負荷の数値は調整できます(24コアでは適切だと思います)。 loadavgを負荷制限(デフォルトでは1.5)を超えない場合は並列に実行できます。または、loadavgを1.5を超えて個別に増やす場合は、シリアルで実行します。

atqでジョブキューを表示し、atrmでジョブを削除できます

依存関係の回答:

  1. atdデーモンの実行(ps -ef|grep atd
  2. atdにジョブを送信することが許可されています(/etc/at.deny//etc/at.allow構成によって拒否されていません)
  3. 機能sendmail MTA

ほとんどのシステムではこれらの要件に問題はありませんが、確認する価値があります。

31
Jodie C

ええ、あります

command; echo "Process done" | mail -s "Process done" [email protected]

-s "text"が件名である場合、エコーはあなたに送信するテキストをメールに与えます。

50
Bonsi Scott

pythonスクリプトを設定してメールを送信することをお勧めします。スクリプトは非常に簡単に記述でき、使用するサービスに合わせて正しいメールサーバーを設定できます。次のようになります。

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

これは、他の回答で提案されているパイプ演算子と組み合わせて使用​​してください。

この問題に対して私が見つけたもう1つの素晴らしい解決策は、 Pushover を使用することです。プッシュオーバー-「プッシュオーバーを使用すると、AndroidおよびiOSデバイスにリアルタイム通知を簡単に送信できます。」私は、ビルド時に簡単なAPIを使用して電話にメッセージを送信する簡単なスクリプトをセットアップしました完了しました。

curl -s \
  -F "token=APP_TOKEN" \
  -F "user=USER_KEY" \
  -F "message=The build is done." \
  https://api.pushover.net/1/messages.json
7
Tom Cammann

trapコマンドを使用して、プロセスの終了時、または中断時、ハングアップ時、またはプロセスの終了時にメールを送信することもできます。スクリプトの先頭に配置する必要があるコードは次のとおりです。

    trap 'mail -s "Process done" [email protected]' exit # It will mail on normal exit
    trap 'mail -s "Process interrupted" [email protected]' INT HUP# it will mail on interrupt or hangup  of the process

アルン

6
user1678213

私は 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の問題を改善するには、GitHubの問題を解決してください。

5
Arlo

home-grown script があります。使用法:

mail-after <your command>

件名に意味のある情報が含まれ、本文にプロセスの出力が含まれる電子メールが送信されます。

インストール手順は GitHubリポジトリのメインページ にあります。現在、すべてのスクリプトに対して、~/binにシンボリックリンクが作成されます。

2
krlmlr

プログラムがすでに実行されていると仮定して、bash + pgrepを使用してプログラムを監視します。

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
[email protected]
echo Watching $PROGRAM; while pgrep $PROGRAM &>/dev/null ; do sleep 1; echo -ne "."; done ; echo "$PROGRAM process done" | /bin/mail -s "$PROGRAM process done" $RECIPIENTS;
1
Matt Callaway

何年も前に、私はこのエイリアスを作成しました(cshで、今はtcshで使用しています)。

alias shunt "( \!* | Mail -s 'Output of: \!*' $user) >& /dev/null &"

Mailがシステムにインストールされて動作している必要がありますが、コマンドをコマンドラインから実行する場合と同じように(エイリアス、チルダ展開などを含む)実行できるという利点があります。 atまたはcronは、スクリプトが失敗したり、異常な出力を提供したりするのに十分異なる可能性があるデフォルト環境で実行されます(cron many回)

0
barrycarter