プロセスが終了したときに通知メールを送信できるプログラムはありますか?


46

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

問題は、シミュレーションに時間がかかることです。すべてのノードを24時間シミュレーションで動作させたいのですが、新しいシミュレーションを開始するには、ターミナルでログインして手動で作業する必要があります。しかし、シミュレーションにどれだけの時間が残っているかを常に忘れているので、常にそれらを常にチェックしています。

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

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


3
これは、タイトルですでに説明されている簡単な質問の、かなり長く無関係な説明でした。あなたはいつもこれをしますか?
Acumenus 14年

5
@ABB科学者として、私は「長く無関係な」説明の中に有用な情報があると考えています。たとえば、手動の端末作業が必要であることがわかっているため、質問する理由があります。さらに、OPが何をしているのかについていくつかのアイデアがあるので、完全に暗闇で考えているわけではないので、質問では要求されないが有用または興味のある追加情報を提供できる場合があります。
user3728501

回答:


30

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. 機能的なsendmailMTA

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


49

ええ、あります

command; echo "Process done" | mail -s "Process done" mail@domain.tld

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


4
このmailコマンドでは、ローカルMTAを適切に構成する必要があります。これは簡単でシンプルなソリューションです。
ヨルダン

6
あなたも使用することができますmailあなたのコマンドの出力を送信するために:{ command; echo Done; } | mail -s "subject" recipient@example.com
グレンはジャックマン

4
@Andrewこれが機能するためには、元のコマンドを実行したターミナル/シェルを開いたままにする必要があることに注意してください。screenまたはのようなものを使用する場合、これは難しくないかもしれませんtmuxが、端末なしで何日か/何週間も端末を開くのは面倒かもしれません。ジョブ管理用ソリューションatもその問題を処理します。
カレブ

@Caleb Cantを&コマンドの最後に追加して、バックグラウンドで実行できるようにします。sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
テオKouzelis

@Theoいいえ、できません。バックグラウンドでも、プロセスはシェルの子であり、シェルが停止すると、子プロセスは強制終了シグナルを受け取ります。あなたは可能性が使用しnohup、それらのリンクを解除していますが、シェルからそれを制御し続ける能力を失います。これは部分的にtmux目的です。アクティブに接続され表示されているターミナルセッションから実行中のプロセスを離婚させながら、通常どおりそれらを操作できるようにします。
カレブ

7

メールを送信するようにpythonスクリプトを設定することをお勧めします。使用するサービスに合わせて適切なメーリングサーバーを簡単に作成および構成できます。これらは次のようになります。

#!/usr/bin/python

import smtplib

sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']

message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
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"

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

私がこの問題を発見した別の素晴らしい解決策は、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

6

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

    trap 'mail -s "Process done" mail@domain.tld' exit # It will mail on normal exit
    trap 'mail -s "Process interrupted" mail@domain.tld' INT HUP# it will mail on interrupt or hangup  of the process

アルン


5

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


2
既に実行中のプロセスにPIDでアタッチできるため、私にとっては勝者です。
joseph_morris 16

1
@joseph_morris私もこのスクリプトが好きですが、完全を期すために、コマンドを発行することで、このヘルパーなしで実行中の(Ctrl-Zで中断)プロセスに簡単にアタッチできますfg ‹PID›; mail -s Completed to@example.com <<< 'Message here'
コンラッドルドルフ


1

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

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
RECIPIENTS=you@yours.com
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;

似たようなものを使用しました:while [[$(pgrep myprog)]]; 寝る60; 完了; echo "myprogは完了しました" | mail -s「処理完了」mail@example.com
marlar

0

昔、私はこのエイリアスを作成しました(cshでは、現在tcshで使用しています)。

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

それはそれが必要ですMailインストールし、システム上で作業することが、それは、コマンドラインから(など、エイリアスを含む拡張チルダ)と同じように、あなたのコマンドが正確に実行されるという利点を持っている-あなたが使用してジョブを実行したときatか、cronそれがデフォルトの下で実行されますスクリプトが異常出力を失敗したり、提供させるのに十分に異なる場合があり環境(私はからそれにかましてきたcron多くの回)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.