tmori’s blog

公開メモ帳くらいの感覚で書いています。技術系多め。日常少なめ。

フォルダを監視して新規作成されたファイルの中身をslackに通知した話

はじめに

現在、大学で深層学習を使った研究を行っています。
学習が終わるまでlsを叩く日々にうんざりしたので、学習が終わったらslackに出力結果を通知してくれるシステムを構築しました。

f:id:tmoribanner:20191106160433p:plain
全体の完成図

環境

  • 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

実際の通知画面

終わりに

学習途中の正答率とlossがSlackで確認できるのが最高に便利!!シェルスクリプトつよつよになれば色んなことができそうですね。