フォルダを監視して新規作成されたファイルの中身をslackに通知した話
はじめに
現在、大学で深層学習を使った研究を行っています。
学習が終わるまでlsを叩く日々にうんざりしたので、学習が終わったらslackに出力結果を通知してくれるシステムを構築しました。
環境
- CentOS 7
- incron
- Slack Incoming Webhooks
手順
1. incronのセットアップ
incronはLinuxのinotfiyという仕組みを使ってファイル作成、変更などのイベントを検知してジョブを実行させるもの。
セットアップの方法は incronを使ってみた - Qiita が完結にまとめてくださってるのでこれを参考にしてください。
2. Slack Incoming Webhooksのセットアップ
Slackにメッセージを通知するときに使用します。
SlackのIncoming Webhooksを使い倒す - Qiita の記事がすごくわかりやすいのでこちらを参考にセットアップしてください。
3. シェルスクリプトの作成
シェルスクリプトを初めて書いたのでもっと効率の良い書き方があるかも知れません。
#!/bin/bash set -eu # メッセージを一時保存する場所 MESSAGEFILE=$(mktemp -t webhooksXXXX) # 終了時に削除 trap "rm ${MESSAGEFILE}" 0 # /home/hogehoge の部分は監視したいフォルダの絶対パスを記述 # FILE_NAMEは更新が最新のファイルディレクトリを取得 FILE_NAME=$(ls -1t /home/hogehoge | head -1) # WebHookのURL URL='WEBHOOKのURLをここに書く' # 送信先のチャンネル(slack Incoming Webhooksで指定したチャンネル) CHANNEL=${CHANNEL:-'#general'} # botの名前 BOTNAME=${BOTNAME:-'botの名前'} # botのアイコンになる絵文字を指定 EMOJI=${EMOJI:-':robot_face:'} # 見出し HEAD=${HEAD:-"*${FILE_NAME}* has been updated :male-technologist: \n"} # メッセージ内にダブルクオーテーションは使用できないのでtrで変換 # /home/hogehoge は監視したフォルダまでの絶対パスを記述 cat /home/hogehoge/${FILE_NAME} | tr \" \' > ${MESSAGEFILE} # メッセージをシンタックスハイライト付きで取得 MESSAGE='```'`cat ${MESSAGEFILE}`'```' payload="payload={ \"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${EMOJI}\", \"text\": \"${HEAD}${MESSAGE}\" }" # 送信 curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null
4. ジョブの登録
今回は新規作成されたファイルを監視したいのでイベントは"IN_CREATE"を指定。
incrontab -e [監視対象のフォルダ] [イベント] [実行するコマンド (3. で書いたシェルスクリプト)]
例
/home/hogehoge IN_CREATE /home/hoge.sh
実際の通知画面
追加されたファイルの中身を出力するようにシェルスクリプトを追記しました!これで外でも学習結果が見れるようになるはず(中身は適当にエラーさせたものなので気にしないで!) pic.twitter.com/LzaY02HwJx
— Tmori. (@bannerforest) 2019年11月4日
終わりに
学習途中の正答率とlossがSlackで確認できるのが最高に便利!!シェルスクリプトつよつよになれば色んなことができそうですね。