ケメログ -ケメ子のブログ-

ケメ子のブログ

Python使ってLinuxのコマンド終了時にLine でプッシュ通知してくれるやつ

いや、デフォで入ってろよ、というのがこれね。

そもそも、なんかのコマンドの終了通知くらいもとから入っててしかるべきだと思うんだけど、なかったので作りました。

 

まぁ、相変わらず「なんちゃってコーダー」なので参考程度に見てみてください。

 

 Line に通知を送るスクリプト

# -*- coding: utf-8 -*-
import requests
import sys

args = sys.argv

class LINENotifyBot:
    API_URL = 'https://notify-api.line.me/api/notify'
    def __init__(self, access_token):
        self.__headers = {'Authorization': 'Bearer ' + access_token}

    def send(
            self, message,
            image=None, sticker_package_id=None, sticker_id=None,
            ):
        payload = {
            'message': message,
            'stickerPackageId': sticker_package_id,
            'stickerId': sticker_id,
            }
        files = {}
        if image != None:
            files = {'imageFile': open(image, 'rb')}
        r = requests.post(
            LINENotifyBot.API_URL,
            headers=self.__headers,
            data=payload,
            files=files,
            )

if __name__ == '__main__':
    bot = LINENotifyBot(access_token='ACCESS TOKEN NUMBER')

    if(len(args) > 1):
        if(args[1] == "ERROR"):
            bot.send(message="Something is Wrong!!")
        elif(args[1] == "START"):
            bot.send(message="Simulation is Start!!")
        else:
            bot.send(
                message=args[1] + ' is done!!',
                image='owatta.png',  # png or jpg
                #sticker_package_id=1,
                #sticker_id=13,
            )

 

とりあえず、↑が「Line に通知を送るスクリプト」です。

詳しいことは、この記事(https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9) を見てください。

 

やっていることはほとんど同じです。

 

一応もう少し細かいことを書いておくと、

 

コマンドライン引数が

  1. python ○○.py ERROR の時 ... エラー通知をする
  2. python ○○.py START の時 ... 正常にスタート通知をする
  3. python ○○.py JOBNAME の時 ... 「JOBNAME is done!」を通知する

こんな感じです。

 

通知を送るシェルスクリプト

 

次は、この通知を送るシェルスクリプトです。

私もいまいちわかってないので、説明はしないけど。


#!/bin/bash

#変数がなかったら、エラーを吐いて終了
if [ $# = 0 ]; then
    echo "need argument 'job number'" 1>&2
    python ./line_notify.py ERROR
    exit 0
fi


function waitfunction_by_jobname() {

  python ./line_notify.py START

  while :
  do
    RET=$(qstat | grep $1 | wc -l)
    if [ $RET -eq 0 ]; then
      return
    else
      echo "Sleep 60sec"
      sleep 60
    fi
  done
}

echo "Monitoring Start"

#最初の引数($1)の名前がでてこなくなるまで待つ
waitfunction_by_jobname $1

#ディレクトリの.py を実行して通知を送る
python ./line_notify.py $1

echo "$1 is done & Send Notification!"

exit 0

 

 

こちらは、この記事(https://qiita.com/ssh0/items/7baa0cd094d9fb7561e1) を参考にしました。

 

動作としては、

  1. 引数がないときは先ほどのpython コードに引数ERROR を入れて実行
  2. 引数の正確なjobname を入れると、先ほどのコードに引数JOBNAMEを入れて実行

 

しれくれます。

 

もう少しだけ詳しく書くと、60 秒ごとにqstat で実行しているjobname を表示させて、その中で「引数に取った jobname がなくなる」まで永遠にループしてくれます。

 

 

スクリプトの動かし方とか

 

 このスクリプトを、nohup というコマンドを使って走らせます。

こんな感じで。

 


    nohup sh ○○.sh JOBNAME

 

 nohup コマンドは、ssh の接続を切っても実行してくれるんだ。すごいね。

 

これをやると、こんな感じで通知が届く。うれしいね。

 

 

ラインで通知しれくれるやーつ

Line Notify

 

これでたくさん研究ができるね!

 

わーい...

 

 

...

 

 

わー... い?