サービスの自動起動失敗
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