ジョブの開始と終了をちまちま確認しにいくの嫌ですよね
ほとんどこの記事通りです.
やりたいこと
hoge.sh
をTSUBAMEに投げる時,ジョブ待ちから実行になった時&ジョブ終了時にSlack通知が来て欲しい
実現方法
hoge.sh
内の実行コマンド部分にslacknotice
という自作コマンドを噛ませる
slacknotice python3 main.py
注意点
-
pythonを利用するのでpythonのインストールされている環境でのみ動きます.
-
「ジョブ待ちから実行になった時&ジョブ終了時」とはいったものの実際に通知が来るのがコマンド実行時なので,それより前の部分でエラーが発生してジョブが終了してたり,TSUBAMEの実行時間制限に引っかかって強制終了した場合,通知は来ません.
実現手順
Slackに通知用チャンネルをつくり, Incoming Webhookを連携
通知を送りたいチャンネルを決めておく.
Incoming Webhookを連携させる.この時生成されるhttps://hooks.slack.com/services/
から始まるWebhookURLをコピーしておく.
slacknoticeコマンドを作成
以下のようなslacknotice
ファイルを作り,好きな位置に保存しておく.元記事とほぼ一緒です.
(元記事にならって自身のディレクトリ配下にscriptsディレクトリを作ってそこに作成しておけばいいと思います.以下では~/scripts/slacknotice
というふうに作成したとします)
#!/usr/bin/env python <-これは必須のやつ
# ここを取得したWebhook URLに変更
webhook_url = "https://hooks.slack.com/services/hoge/fuga"
import json, os, requests, sys
from subprocess import run
# 通知を送る関数を定義
def notice(msg):
post_data = json.dumps({"text": msg})
requests.post(webhook_url, data=post_data, headers={"Content-Type": "application/json"})
# 引数から実行するコマンドを取得
commands = sys.argv[1:]
# 実行前通知
notice(f"実行開始!: {commands}")
# コマンド実行、ユーザーのカレントディレクトリ(os.getcwd())で実行するようにしている。
run(commands, cwd="{}/".format(os.getcwd()))
# 実行後通知
notice(f"実行終了!: {commands}")
~
もし実行するpyhton環境にrequestsモジュールをインストールしていなかった場合import json, os, requests, sys
の部分で詰まるので,利用している環境に合わせてpipかcondaでインストールしておこう.(食べごろうは以下のスクリプトでもわかるようにconda環境を利用しているので事前に以下の操作をしておいた)
conda activate my_env
conda install requests
仕上げに一応権限を与えておく
chmod u+x ~/scripts/slacknotice
実際にジョブを投げる時
今まで投げていたジョブに対しexport PATH="/hoge/fuga/scripts/:$PATH"
の1行を足し,コマンド実行部の頭にもslacknotice
を足す(slacknotice
コマンドに今までのコマンドを引数として渡して,中であらためて実行するイメージ)
これを踏まえたスクリプトはこんな感じ
#!/bin/bash
#$ -cwd
#$ -N Test_job
#$ -l q_node=1
#$ -l h_rt=0:10:0
#$ -V
. /etc/profile.d/modules.sh
module load cuda/10.2.89 cudnn/8.1
source ~/.bashrc
conda activate my_env
export PYTHONPATH="/hoge/fuga/:$PYTHONPATH"
export PATH="~/scripts/:$PATH" ##この1行を追加
slacknotice python3 -u main.py
## ↑ここを追加
ちなみに本題とは関係ないですが,pythonコマンド実行時に-u
オプションをつけると,時間制限で実行が正常に終了しなかったときも終了直前までのログを出してくれるようになって便利だということを今知りました.
その代わり,普段は高速化するためにバッファに貯めて出力してくれてたのを強制的に吐き出させるようにしてるので,やや遅くなるらしい.