長期実行ジョブに使用したいマシンにSSHを介してリモートでアクセスできます。これまで私がしたことは
ssh user@remote command-to-run
これにはいくつかの欠点があります。
- 単にローカルコンピュータを一時停止することはできません。これにより、
SIGHUP
コンピュータはリモートプロセスに転送され、効果的にシャットダウンされます。これを防ぐために、nohupを使用できます。 - 出力がかなり長くなる可能性があるため、ファイルにリダイレクトすることをお勧めします。もちろん、手動で行うこともできますが、一連のコマンドを使用すると処理が難しくなります。
- このプロセスの実行に時間がかかることがあります。理想的には、送信者は単にコマンド(スクリプト)が正常に送信されたことを確認して終了します。
- プロセスが終了したら、終了コードとともにメール通知を受け取りたいと思います。もちろん、シェルスクリプトとターミナルコマンドを使用して手動で送信することもできます。これは別のトリックです。
- 同時に複数のスクリプトを安全に予約できるようにしたいです。特に、手動で名前を変更することなく、同じ名前の複数のスクリプトをプッシュできるようにしたいです。ファイルシステムにすでに存在するファイルについて心配したくありません。
これは SLURM の機能と非常に似ていますが、リモート側の管理権限はありません。さらに、リモートシステムのすべてのコアにアクセスできるときに必要なコア数を宣言することは意味がありません。
私が使用できるものはありますか?私が説明した内容は一般的なユースケースのようです。
答え1
これらの長期実行タスクを実行するスクリプトをリモートシステムに配置できる場合は、簡単になります。
#!/bin/bash
# This script will run a long-running-job (if it's not already running)
# and email when it completes.
lockfile=/var/run/long-job-1.lock
logfile=$(mktemp)
errfile=$(mktemp)
if [[ -f "$lockfile" ]]; then
echo "This job is already running." 1>&2
exit 1
else
echo $$ > "$lockfile"
trap 'rm -f "$lockfile" "$logfile" "$errfile"' EXIT
fi
/path/to/some/really/longrunning/job.sh
returncode=$?
if [[ 0 -ne "$returncode" ]]; then
cat "$errfile" | mailx -s "Job failed with exit code $returncode" -a "$logfile" [email protected]
else
cat "$logfile" | mailx -s "Job succeeded" [email protected]
fi
このスクリプトをリモートサーバーのホームディレクトリにlongjob1.sh
。ローカルに配置すると、次のことができます。
ssh username@remotehost "screen -dmS LongJob1 ./longjob1.sh"
スクリプト(および呼び出されるアクション)はscreen
リモートサーバーのセッションで実行され、完了すると電子メールを送信します。エラーが原因で終了すると、標準ログとともに電子メールでエラーログが届きます。