私は計算科学者であり、Linuxで多くの時間のかかる計算を実行しています。具体的には、 GROMACSパッケージを使用して分子動力学(MD)シミュレーションを実行します。 これらのシミュレーションは、(たとえば)8〜24コアで実行する場合、数日または数週間かかる場合があります。クラスターのいくつかのノードにアクセスできます。つまり、常に4つまたは5つのジョブ(それぞれが異なるノードで、それぞれ8〜24コア)を実行しています。
問題は、シミュレーションにさまざまな時間がかかることです。すべてのノードが24時間体制でシミュレーションを実行できるようにしたいのですが、新しいシミュレーションを開始するには、ターミナルでログインし、手動で作業する必要があります。でも、シミュレーションの残り時間を忘れているので、常にチェックしている。
Linuxプロセスが終了したときに電子メールを受信する方法はありますか?これを行うLinuxプログラムはありますか?そうすれば、ターミナルにログインして次のシミュレーションを準備するタイミングがわかります。
Ubuntu Linuxを使用しています。御時間ありがとうございます。
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
でジョブを削除できます
依存関係の回答:
atd
デーモンの実行(ps -ef|grep atd
)atd
にジョブを送信することが許可されています(/etc/at.deny
//etc/at.allow
構成によって拒否されていません)sendmail
MTAほとんどのシステムではこれらの要件に問題はありませんが、確認する価値があります。
ええ、あります
command; echo "Process done" | mail -s "Process done" [email protected]
-s "text"が件名である場合、エコーはあなたに送信するテキストをメールに与えます。
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
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
アルン
私は 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の問題を解決してください。
home-grown script があります。使用法:
mail-after <your command>
件名に意味のある情報が含まれ、本文にプロセスの出力が含まれる電子メールが送信されます。
インストール手順は GitHubリポジトリのメインページ にあります。現在、すべてのスクリプトに対して、~/bin
にシンボリックリンクが作成されます。
プログラムがすでに実行されていると仮定して、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;
何年も前に、私はこのエイリアスを作成しました(cshで、今はtcshで使用しています)。
alias shunt "( \!* | Mail -s 'Output of: \!*' $user) >& /dev/null &"
Mail
がシステムにインストールされて動作している必要がありますが、コマンドをコマンドラインから実行する場合と同じように(エイリアス、チルダ展開などを含む)実行できるという利点があります。 at
またはcron
は、スクリプトが失敗したり、異常な出力を提供したりするのに十分異なる可能性があるデフォルト環境で実行されます(cron
many回)