NTP サービス再起動ポリシーを設定した

今朝、様々な環境(物理/仮想/クラウド、Debian,Ubuntu の世代もバラバラ)で NTP サービスが一斉に止まっていた。個別の事象というより共通要因があると判断し、調査して対応した。


事象

  • いくつかのホストで ntp, ntpsec, myntpinactive になっていた。
  • 手動で 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."

再発防止としての効果は大きい。