⏰
systemdでサーバーを定期的に再起動させる
様々な事情でLinuxマシンを定期的に再起動させたいことがある。cronを使うのがいちばんシンプルな方法ではあるが、今回はsystemdのタイマー機能を使って実現してみる。
手順
-
/etc/systemd/system/reboot.service
をつくる。
/etc/systemd/system/reboot.service
[Unit]
Description = Reboot
RefuseManualStart = true
RefuseManualStop = true
[Service]
ExecStart = /sbin/reboot
-
/etc/systemd/system/reboot.timer
をつくる。この例では、日本時間で毎週月曜日の午前3時を指定した。
/etc/systemd/system/reboot.timer
[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