⏰
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と設定する。
2. reboot.serviceにWantedBy = multi-user.targetを書かない
reboot.serviceを書くとき、ついいつもの癖で
[Install]
WantedBy = multi-user.target
と設定しそうになってしまうが、絶対にしてはいけない。この記述は、OS起動時に自動で起動させたいサービスにのみ必要なものである[1]。
これを書いた状態でうっかりsudo systemctl enable rebootとかsudo systemctl enable reboot.serviceを実行してしまうと、サーバーが起動するたびに/sbin/rebootが実行されることになってしまい、再起動ループに入って詰むので気をつける。(経験済み)
Discussion