はじめに
自宅に学習用途で構築中のUbuntuファイルサーバーの共有ディレクトリにファイルが追加された際、リアルタイムでその情報をDiscordに通知する仕組みを作成した際の手順メモです。
目的は自身の備忘録としてですが、「シェルスクリプトやファイル監視の自動化を学びたい方」にとっても再現しやすい内容になっていると思います。
環境・前提
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04.2 LTS |
| 実行環境 | 自宅内の物理サーバー(Ubuntuファイルサーバー) |
| 通知先 | Discord Webhook |
| 共有ディレクトリ | /srv/share |
| 前提知識 | LPIC Level1 相当(基本的なCLI操作、シェル理解してたら誰でも) |
やりたいこと(ゴール)
- Sambaで共有している
/srv/shareに誰かがファイルをアップしたら… - そのファイル名とアップロードしたユーザー名をDiscordに通知したい!
- さらに、再起動後も自動で監視が始まるようにしたい!
手順1:inotify-toolsのインストール
sudo apt update
sudo apt install inotify-tools curl
手順2:Discord Webhookの作成
- Discordサーバーを作成(自分用でOK)
- 通知用のテキストチャンネルを作成(名前は適当で!私は#upload-watchにしました)
- チャンネル設定 → [連携サービス] → [Webhookを作成]
- Webhook URLをコピー
手順3:監視スクリプトの作成
sudo vim /usr/local/bin/watch_uploads_discord.sh
sudo vim /usr/local/bin/watch_uploads_discord.shの中身:
#!/bin/bash
# 監視対象のディレクトリ(Sambaで共有されているディレクトリを想定)
WATCH_DIR="/srv/share"
# ログファイルの出力先(ファイル追加の記録を保存)
LOG_FILE="/var/log/filewatch_discord.log"
# DiscordのWebhook URL(事前にDiscord側で作成しておく)
WEBHOOK_URL="https://discord.com/api/webhooks/xxxxxxxx" # 自分のWebhook URLに置き換える
# inotifywaitで対象ディレクトリを監視
# -m:常に監視し続ける(monitorモード)
# -e create:新しいファイルが作成されたイベントだけを監視
# --format "%w%f":フルパス形式で出力(%w=ディレクトリ, %f=ファイル名)
inotifywait -m -e create --format "%w%f" "$WATCH_DIR" | while read NEWFILE
do
# 現在時刻を取得(ログに記録するため)
NOW=$(date "+%Y-%m-%d %H:%M:%S")
# フルパスからファイル名だけを抽出
FILENAME=$(basename "$NEWFILE")
# ファイルの所有ユーザー名を取得(アップロード者として表示)
FILEOWNER=$(stat -c %U "$NEWFILE")
# ログファイルに記録(タイムスタンプ・ファイル名・ユーザー)
echo "[$NOW] $FILENAME was created by $FILEOWNER" >> "$LOG_FILE"
# DiscordへWebhook通知を送信
# -s:進捗を表示しない
# -H:HTTPヘッダでContent-Type指定(JSON)
# -d:POSTするJSONデータ(改行は \\n で表現)
curl -s -H "Content-Type: application/json" \
-X POST \
-d "{
\"content\": \"📥 新しいファイルがアップロードされました!\\n🗂️ ファイル名: \`$FILENAME\`\\n👤 アップロードユーザー: \`$FILEOWNER\`\"
}" \
"$WEBHOOK_URL"
done
実行ファイルに権限が付与されているかも一応:
sudo chmod +x /usr/local/bin/watch_uploads_discord.sh
手順4:systemdサービスファイルの作成
毎回起動後に実行しているのが面倒なので、systemdに登録しました:
sudo vim /etc/systemd/system/watch_uploads.service
中身:
[Unit]
Description=Watch /srv/share for new files and send Discord notification
After=network.target
[Service]
ExecStart=/usr/local/bin/watch_uploads_discord.sh
Restart=on-failure
User=root
[Install]
WantedBy=multi-user.target
手順5:systemd再読み込みとサービス起動
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start watch_uploads.service
sudo systemctl enable watch_uploads.service
動作テスト
実際に共有ディレクトリ(/srv/share)にファイルを作成して保存してみる:
touch /srv/share/test_notify.txt #作成するファイル名はなんでもいいです!
今後の応用アイデア
- 拡張子で通知対象を制限したい(
.pdf,.jpgとか) - ファイルサイズなども通知に追加
やってみて
inotifywait は軽量かつ即時性が高く、監視用途に最適だった。Discord Webhookは導入が簡単で、通知テストもすぐできるのが良いですね。
またbasename, stat など基本的なシェルコマンドの実用例として良い勉強になりました。
systemd化により再起動耐性もついたため、業務用途のファイル監視にも応用できればしていきたいです!
