🐧 Linux 総合学習プラットフォーム
自動化/定期実行 ・ 中級

自動処理の結果を通知する

自動化でいちばん怖いのは、失敗したことに誰も気づかないことです。動いているつもりのバックアップが3週間前から止まっていた、という事故は珍しくありません。この回では、コマンドの終了コード $? で成否を見分け、成功と失敗で動きを分け、cron のメールや curl による webhook で結果を届ける方法を学びます。ポイントは「ログには全部残す・人には失敗したときだけ知らせる」設計です。通知しすぎると狼少年になり、誰も見なくなります。

自動化された処理でいちばん怖いのは、失敗そのものではない。失敗したことに誰も気づかないことだ。毎晩のバックアップが3週間前から静かに止まっていて、いざ復元しようとして初めて気づく。こういう事故は珍しくない。

cron に仕掛けたジョブは、成功しても失敗しても、基本は黙って終わる。画面を見ている人はいない。だから自動化には「うまくいったか・こけたか」を外へ伝える口を、意図して付けてやる必要がある。

🔗
たとえ通知のない自動処理は、返事をしない配達員のようなものだ。荷物が届いたのか、途中で落としたのか分からない。せめて「失敗したときだけは連絡します」という約束を交わしておきたい。
💡
ポイント自動化の価値は「動くこと」だけでなく「こけたと分かること」で決まる。黙って失敗する仕組みは、無いより危ういことすらある。

🔢 成否を握る終了コード

成否を見分ける鍵は、終了コード(exit code)だ。コマンドは終わるとき、0 なら成功、0 以外なら失敗、という数字をこっそり残す。この直前のコマンドの終了コードは、特別な変数 $? で読める。

直前のコマンドが成功したか、数字で確かめる。 $ ls /etc/hosts /etc/hosts $ echo $? 0 $ ls /no/such/file $ echo $? 2

0 が返れば万事うまくいった証、0 以外なら何かしくじった証だ。人間はふだん気にしないが、この数字こそがスクリプト同士の会話に使う「合否の signal」になる。

処理を実行$? を見る成功(0)ログに残すだけ失敗(0以外)人へ通知する&&||

🔀 && と || で分岐する

この終了コードを使うと、成功と失敗で動きを分けられる。A && B は「A が成功したら B もやる」、A || B は「A が失敗したら B をやる」という意味の、シェルの短い書き方だ。

バックアップが成功したら記録、失敗したら知らせる、を1行で表す。 $ backup.sh && echo OK >> /var/log/backup.log || notify-fail.sh

&& と || を並べると、ちょうど「うまくいけばこっち、こければあっち」の分かれ道になる。失敗したときの側にだけ通知を置けば、平常時は静かで、異常時だけ声を上げる仕組みになる。

💡
ポイント&& は成功の道、|| は失敗の道。通知は || の側に置く。これで「失敗したときだけ知らせる」が1行で書ける。
つまずきパイプ(|)でつないだ場合、$? は最後のコマンドの結果しか映さない。途中がこけても最後が成功すると 0 に見えることがある。厳密に見たいときは、bash の set -o pipefail を使うと途中の失敗も拾える。

📧 cron からメールで受け取る

定期実行の cron には、通知の口が最初から付いている。crontab の先頭に MAILTO を書いておくと、ジョブが何か画面へ出力したとき、その内容が指定アドレスへメールで届く。

crontab の先頭に宛先を書く。以降のジョブの出力がここへ送られる。 MAILTO=admin@example.com 0 3 * * * /opt/backup.sh

コツは「ふだんは何も出力させない」ことだ。cron は出力があるときだけメールするので、成功時は沈黙・失敗時だけエラーを出力するように書けば、メールが来た=異常、という分かりやすい運用になる。

つまずきMAILTO が働くには、サーバーにメールを送れる仕組み(MTA)が入っている必要がある。無い環境も多いので、その場合は次の webhook のほうが手軽なことが多い。

🔔 curl で webhook へ飛ばす

メールが使えない、あるいはチャットで受け取りたいときは、webhook(ウェブフック)が便利だ。webhook は「この URL を叩けば通知が飛ぶ」という受け口で、チャットツールの多くが提供している。そこへ curl で HTTP を送るだけでいい。

失敗時にチャットの webhook へメッセージを飛ばす。URL は各ツールが発行したものを使う。 $ curl -X POST -H 'Content-Type: application/json' -d '{"text":"backup 失敗"}' https://example.com/webhook/xxxx

-X POST は送信の種類、-H はヘッダー、-d は送る中身(ここでは JSON)を表す。これをスクリプトの || の側に置けば、こけた瞬間に手元のチャットへ赤い通知が届く、という運用ができあがる。

処理が失敗|| curl ...webhook URL受け口チャットに通知手元で気づくPOST

🐺 通知しすぎは狼少年

通知は多ければよいものではない。成功のたびに鳴らすと、通知は日常の風景になり、本当に危ないときの1通が埋もれてしまう。イソップの狼少年と同じで、鳴らしすぎた警報は誰も見なくなる。

だから設計の芯は「ログには全部残す・人には失敗したときだけ知らせる」だ。細かな足あとは静かにログへ書き、人の注意を呼ぶのは対応が要るときだけにする。この線引きが、通知を生きたままに保つ。

💡
ポイント記録(ログ)と通知(人へ)は役割が違う。すべてを記録し、通知は絞る。鳴らす回数を減らすほど、その1通の重みが増す。
コツそれでも通知が増えてきたら、「同じ失敗が続くときは最初の1回だけ鳴らす」「復旧したら1回だけ知らせる」といった工夫を足すとよい。まずは失敗時だけの1本から始めれば十分だ。

黙って失敗しないこと。これだけで自動化の信頼はぐっと上がる。終了コードで成否を見て、失敗の道に通知を置き、鳴らしすぎない。この3つを守れば、あなたの仕組みは「気づける自動化」になる。

この項目に出てくる用語

終了コードしゅうりょうこーど
コマンドが終了時に残す数値。0 が成功、0 以外が失敗を表す。
webhookうぇぶふっく
この URL を叩けば通知が飛ぶ、という受け口。HTTP で外部へ知らせる仕組み。
MAILTOめいるとぅー
crontab に書く宛先。ジョブが出力を出すと、その内容がメールで届く。

▶ 学習アプリでこの続きを学ぶ・演習する