systemdでサーバーを定期的に再起動させる

2021/09/28に公開

様々な事情でLinuxマシンを定期的に再起動させたいことがある。cronを使うのがいちばんシンプルな方法ではあるが、今回はsystemdのタイマー機能を使って実現してみる。

手順

  1. /etc/systemd/system/reboot.serviceをつくる。
/etc/systemd/system/reboot.service
[Unit]
Description = Reboot
RefuseManualStart = true
RefuseManualStop = true

[Service]
ExecStart = /sbin/reboot
  1. /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
  1. sudo systemctl enable --now reboot.timerでタイマーを有効化し、起動する。

  2. systemctl status reboot.timerでタイマーが起動していることを確認する。

ポイント

1. 再起動時刻は最大で1分遅れることがある

先述した例では省略しているが、[Timer]にはAccuracySecという設定項目があり、デフォルトでは1m(1分)になっている。このとき、タイマーはOnCalendarで指定した時間から1分以内の適当なタイミングで実行される(OnCalendarで指定した時間より前に実行されることはない)。
正確に3:00:00に再起動を始めたい場合は、AccuracySec = 1sと設定する。

2. reboot.serviceWantedBy = multi-user.targetを書かない

reboot.serviceを書くとき、ついいつもの癖で

[Install]
WantedBy = multi-user.target

と設定しそうになってしまうが、絶対にしてはいけない。この記述は、OS起動時に自動で起動させたいサービスにのみ必要なものである[1]

これを書いた状態でうっかりsudo systemctl enable rebootとかsudo systemctl enable reboot.serviceを実行してしまうと、サーバーが起動するたびに/sbin/rebootが実行されることになってしまい、再起動ループに入って詰むので気をつける。(経験済み)

脚注
  1. https://qiita.com/ledmonster/items/5f2e1633d4124cb978fe ↩︎

GitHubで編集を提案

Discussion