コース一覧
Linux道場 商店街サーバー障害対応の10問
定期実行が動かない理由を突き止めろ

Linux道場 商店街サーバー障害対応の10問

Linux入門で身に付けた技を、商店街事務局のサーバー当番として試す演習専用コースです。解説はありません。障害の報告と復旧条件だけを読み、原因を自分で突き止めて直します。手が止まったときのために、方針・使うコマンド・部分解の3段階のヒントを各問に用意しています。他の道場と違い、白紙から書き始めるのではなく、すでに壊れている機械の前に座るところから始まります。ブラウザの中で本物の Debian が動いていて、打ったコマンドはそのまま本物の機械に効きます。迷子のファイル探しから始まり、ログからの原因特定、権限、ディスク不足、暴走プロセス、PATH、スクリプトの起動失敗、定期実行の停止、バックアップからの復元と進み、最後は複数の障害が同時に起きたサーバーを健全な状態まで戻します。1問15分から45分、全10問で約5時間です。Linux入門を終えて「コマンドは知っているが、壊れた機械を前にすると手が止まる」と感じている方に向いています。

1
初段
01. 迷子のファイルを探し出せ15分
02. ログから犯人を特定せよ20分
03. 開けないファイルを開けろ20分
04. ディスクを空けろ25分
2
中段
01. 暴走プロセスを止めろ25分
02. コマンドが見つからない30分
03. 動かないスクリプトを直せ30分
3
師範
01. 定期実行が動かない理由を突き止めろ30分
02. バックアップから復元せよ35分
03. 総合 サーバー健全化ミッション45分

定期実行が動かない理由を突き止めろ

師範 / 目安 30分

「毎晩、勝手に売上をまとめてくれるようにしてあったんだ」

鴫原さんが /var/log/yumesaku-uriage.log を開きます。中身は空です。

「先月までは、朝来ると前の晩ぶんが書かれとった。それが1行も増えとらん。仕込んだ覚えはあるし、ファイルも消しとらん。動いとらんのに、エラーも出とらんのが気味が悪い」

定期実行の障害がやっかいなのは、失敗が目の前で起きないことです。手で打ったコマンドなら、エラーはその場で画面に出ます。裏で動く仕掛けが転んだときは、記録を探しに行かないと何も分かりません。

今日の仕事は、まさにその記録の探し方です。

この機械での定期実行は systemd タイマー

定期実行というと cron を思い浮かべる人が多いはずです。ただ、この機械には cron が入っていません。代わりに使うのが systemd のタイマーです。仕組みは cron より少し多い代わりに、はっきりしています。

仕掛けは2つのファイルの組でできています。

  • <名前>.service — 何をするか。実行するコマンドを ExecStart= に書きます
  • <名前>.timer — いつ動かすか。時刻を OnCalendar= に書き、動かす相手として同じ名前の .service を指します

置き場所は /etc/systemd/system/ です。まず何が仕込まれているかを見ます。

ターミナル

ls -l /etc/systemd/system/ cat /etc/systemd/system/<名前>.timer cat /etc/systemd/system/<名前>.service

仕込んだだけでは動かない

ここが第一の落とし穴です。ファイルを置いただけでは、systemd はそのタイマーを動かしません。動かすには、次の予定に登録させる必要があります。いま登録されているタイマーの一覧は次で見えます。

ターミナル

systemctl list-timers --all --no-pager

NEXT の列に次回の予定、LAST の列に前回動いた時刻が出ます。ここに自分のタイマーの名前が出てこないなら、そもそも登録されていません。登録するのが enable、いますぐ動かし始めるのが start です。両方を一度にやるなら次のように書きます。

ターミナル

systemctl enable --now <名前>.timer

単体の状態は is-enabled と is-active でも確かめられます。

ターミナル

systemctl is-enabled <名前>.timer systemctl is-active <名前>.timer

動き始めても、中身が転ぶことがある

第二の落とし穴です。タイマーが正しく登録されていても、呼ばれた .service のほうが失敗すれば結果は同じで、ログは1行も増えません。

定期実行を待たずに、.service だけを手で動かして試せます。これが調査の要になります。

ターミナル

systemctl start <名前>.service systemctl status <名前>.service --no-pager

失敗していれば failed と出ます。なぜ失敗したかは、そのユニットのログにあります。

ターミナル

journalctl -u <名前>.service -n 30 --no-pager

-u はユニットの指定です。付けずに打つと機械全体のログが流れてきて、目的の行を見失います。-n 30 は末尾30行、--no-pager はページャに入らない指定です。

ここで出てくるエラーは、道場でもう見たことのあるものです。定期実行だからといって特別な失敗をするわけではありません。手で打てば一目で分かる失敗が、見えない場所で起きているだけです。だから手で動かして見えるようにする、というのが今日の勘所です。

完成条件

  1. 売上まとめのタイマーが enable かつ active になっていること
  2. systemctl list-timers の一覧に、そのタイマーが出てくること
  3. 呼ばれる .service が失敗せずに終わること
  4. 実際に /var/log/yumesaku-uriage.log に売上のまとめが書かれていること

進め方

原因は1つとは限りません。1つ直したら systemctl start で試し、また転んだらログを読んでください。

ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

課題

  1. yumesaku-uriage.timer が enable かつ active になっていること
  2. systemctl list-timers の一覧にそのタイマーが出ること
  3. yumesaku-uriage.service が失敗せずに終わること
  4. /var/log/yumesaku-uriage.log に売上のまとめが書かれていること
  5. 原因は1つとは限りません。直しては試し、を繰り返してください

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 裏で動く仕掛けの失敗は目の前に出ません。まず /etc/systemd/system/ に何が仕込まれているかを読み、次に systemctl list-timers で本当に登録されているかを見ます。そのうえで .service を手で動かして、失敗を目の前に引きずり出します

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
  • 1. /etc/systemd/system/ に何が仕込まれているかを ls -l と cat で読む
  • 2. systemctl list-timers --all --no-pager で、本当に登録されているかを見る
  • 3. 登録されていなければ systemctl enable --now で登録する
  • 4. systemctl start で .service を手で動かし、失敗するか確かめる
  • 5. journalctl -u <名前>.service でエラーの理由を読み、原因を直す
  • 6. もう一度 start して、/var/log/yumesaku-uriage.log にまとめが書かれることを確かめる

6 項目で採点します