サービスの自動起動失敗
systemctl
で自動起動設定しているあるサービスが、ある条件下で Start request repeated too quickly.
というエラーメッセージを吐いて起動失敗するという現象が起こりました。で、このエラーでWebを検索すると、サービスのユニットファイルのディレクティブRestart
をalways
にしているのが悪い。これをno
とすれば解決、という記事が結構見つかり「えー」と思ったので解決策を記事にしました。
解決策
ユニットファイルの以下のディレクティブを適切に設定する。
[Unit]
StartLimitIntervalSec=<この間に>
StartLimitBurst=<この回数失敗すると起動を諦める>
[Service]
RestartSec=<次に再起動を掛けるまでの秒数>
例えば、
[Unit]
StartLimitIntervalSec=600
StartLimitBurst=9
[Service]
RestartSec=30
など。こうすると10分間で30秒毎に起動を繰り返し、10回失敗したらStart request repeated too quickly.
で起動を諦めるということになる。
補足
StartLimitIntervalSec
はStartLimitBurst * RestartSec
よりも十分に大きな値を設定しておくほうが良いようです。例えば上の例だと30秒毎で10回までなのでStartLimitIntervalSec
を300秒(5分)にすれば良さそう?ですが、実際には再起動までに30〜45秒かかったりするので(起動するサービスによると思いますが)、StartLimitIntervalSec=300
とするとその間には7、8回しか再起動sず、リミットに達しないため延々と再起動を繰り返すことになりました。なので、StartLimitBurst
回繰り返すのに絶対そこまでの時間はかからないという時間をStartLimitIntervalSec
に設定した方が良いようです。
参考文献
https://man7.org/linux/man-pages/man5/systemd.service.5.html
https://man7.org/linux/man-pages/man5/systemd.unit.5.html