2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TSUBAMEに投げたジョブを監視してSlack通知

Last updated at Posted at 2023-06-28

ジョブの開始と終了をちまちま確認しにいくの嫌ですよね

ほとんどこの記事通りです.

やりたいこと

hoge.shをTSUBAMEに投げる時,ジョブ待ちから実行になった時&ジョブ終了時にSlack通知が来て欲しい

実現方法

hoge.sh内の実行コマンド部分にslacknoticeという自作コマンドを噛ませる

hoge.sh
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コマンドに今までのコマンドを引数として渡して,中であらためて実行するイメージ)

これを踏まえたスクリプトはこんな感じ

hoge.sh
#!/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オプションをつけると,時間制限で実行が正常に終了しなかったときも終了直前までのログを出してくれるようになって便利だということを今知りました.
その代わり,普段は高速化するためにバッファに貯めて出力してくれてたのを強制的に吐き出させるようにしてるので,やや遅くなるらしい.

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?