⏰
systemdでサーバーを定期的に再起動させる
様々な事情で Linux マシンを定期的に再起動させたいことがある。cron を使うのがいちばんシンプルな方法ではあるが、今回は systemd のタイマー機能を使って実現してみる。
手順
-
/etc/systemd/system/reboot.service
をつくる。
[Unit]
Description = Reboot
RefuseManualStart = true
RefuseManualStop = true
[Service]
ExecStart = /sbin/reboot
-
/etc/systemd/system/reboot.timer
をつくる。この例では、日本時間で毎週月曜日の午前3時を指定した。
[Unit]
Description = Weekly Reboot Timer
[Timer]
OnCalendar = Mon 3:00 Asia/Tokyo
[Install]
WantedBy = timers.target
-
sudo systemctl enable --now reboot.timer
でタイマーを有効化し、起動する。 -
systemctl status reboot.timer
でタイマーが起動していることを確認する。
ポイント
1. 再起動時刻は最大で1分遅れることがある
先述した例では省略しているが、[Timer]
には AccuracySec
という設定項目があり、デフォルトでは 1m
(1分)になっている。このとき、タイマーは OnCalendar
で指定した時間から1分以内の適当なタイミングで実行される(OnCalendar
で指定した時間より前に実行されることはない)。
正確に 3:00:00
に再起動を始めたい場合は、AccuracySec = 1s
と設定する。
reboot.service
に WantedBy = multi-user.target
を書かない
2. reboot.service
を書くとき、ついいつもの癖で
[Install]
WantedBy = multi-user.target
と設定しそうになってしまうが、絶対にしてはいけない。この記述は、OS 起動時に自動で起動させたいサービスにのみ必要なものである[1]。
これを書いた状態でうっかり sudo systemctl enable reboot
とか sudo systemctl enable reboot.service
を実行してしまうと、サーバーが起動するたびに /sbin/reboot
が実行されることになってしまい、再起動ループに入って詰むので気をつける。(経験済み)
脚注
Discussion