今朝、様々な環境(物理/仮想/クラウド、Debian,Ubuntu の世代もバラバラ)で NTP サービスが一斉に止まっていた。個別の事象というより共通要因があると判断し、調査して対応した。
事象
- いくつかのホストで ntp, ntpsec, myntp が inactive になっていた。
- 手動で systemctl restart すれば復帰する。
- ログには signal 15 (Terminated) が並ぶ。つまりクラッシュではなく止められた。
1 2 3 | ERR: ntpd exiting on signal 15 (Terminated) systemd[1]: Stopping ntpsec.service - Network Time Service... systemd[1]: ntpsec.service: Deactivated successfully. |
調査の流れ
- journalctl -u ntp* をざっと見ると、外部からの停止命令(systemd)とわかる。
- systemctl list-units –type=service | grep ntp で動作中ユニットを確認。多くのホストで NTP の自動復旧設定が無いことも判明。
- Debian のユニット定義(/lib/systemd/system/ntp*.service)を確認すると、Restart= 指定なし。→ 止まったらそのまま、という設計。
対応案の比較(ざっくり)
- cron で定期 restart:遅い・雑・原因隠す。
- Restart=always:手動 stop でも起き直す。運用がつらい。
- Restart=on-failure + RestartSec=30:異常終了だけ自動復旧、手動は尊重する。こちらを採用。
方針
Restart=on-failure を drop-in で全環境へ。実装の違い(ntp / ntpsec / myntp)はスクリプト側で検出して吸収する。
実装(冪等・最小)
スクリプト setup_ntp_restart_policy.sh を作成し対応した。やっていることはシンプルで、存在するサービスだけに drop-in を置く。
1 2 3 4 | # /etc/systemd/system/<svc>.service.d/restart.conf [Service] Restart=on-failure RestartSec=30 |
適用手順(内部で実施):
1 2 3 4 5 6 7 8 | sudo mkdir -p /etc/systemd/system/<svc>.service.d sudo tee /etc/systemd/system/<svc>.service.d/restart.conf >/dev/null <<'EOF' [Service] Restart=on-failure RestartSec=30 EOF sudo systemctl daemon-reload |
適用後の確認:
1 2 | systemctl show <svc> | grep -E 'Restart|RestartSec' # Restart=on-failure / RestartUSec=30s が見えれば OK |
テスト方法
異常終了シミュレーション(正常 stop だと再起動しないので注意):
1 2 | sudo kill -9 $(pidof ntpd) # または sudo pkill -9 ntpd sudo journalctl -u <svc> -f # 30秒後の再起動ログを追う |
期待ログ:
1 2 3 | ... Main process exited, code=killed, status=9/KILL ... Scheduled restart job, restart counter is 1. ... Started Network Time Service. |
状態確認:
1 | systemctl status <svc> # active (running) |
補足:連続失敗時は start-limit-hit で自動再試行が止まる。復旧は sudo systemctl reset-failed <svc>; sudo systemctl start <svc>。
開発環境での検証
- ntpsec 稼働ホスト:drop-in 配置 → kill → 30秒後に自動復帰を確認。
- ntp 稼働ホスト:同様に確認。ntp-wait.service は起動時のワンショットで問題なし。
- サービス競合なし(片方のみ active)。systemctl list-units –type=service | grep ntp で視認。
得られた知見
- 停止のトリガーが何であれ、サービスに自律回復力を持たせるのが効く。
- drop-in で小さく始めるのが早い・壊れない・パッケージ更新にも強い。
- 監視とログは引き続き大事(再起動ループは検知して止める、start-limit-hit に注意)。
確認
最後に状態を必ず見ておく。
1 | systemctl list-units --type=service | grep ntp || echo "No NTP services are active." |
再発防止としての効果は大きい。