timerを使わず、serviceのみで再起動させる。

はじめに

systemd を使ってサービスを指定した時間に再起動するときに、私の場合 timer ファイルを作って再起動するように仕込んでいたのだが、timer ファイルを使わず、RuntimeMaxSec=を使うことにより、自動的に再起動することができるようになるみたいだ。(実際のところ違うみたいだが)

man を読む

man とはコマンドのマニュアルを表示するものだ。systemd.service 項目を見る。man systemd.service

man systemd.service
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
RuntimeMaxSec=
Configures a maximum time for the service to run. If this is used
and the service has been active for longer than the specified time
it is terminated and put into a failure state. Note that this
setting does not have any effect on Type=oneshot services, as they
terminate immediately after activation completed. Pass "infinity"
(the default) to configure no runtime limit.

If a service of Type=notify sends "EXTEND_TIMEOUT_USEC=...", this
may cause the runtime to be extended beyond RuntimeMaxSec=. The
first receipt of this message must occur before RuntimeMaxSec= is
exceeded, and once the runtime has exended beyond RuntimeMaxSec=,
the service manager will allow the service to continue to run,
provided the service repeats "EXTEND_TIMEOUT_USEC=..." within the
interval specified until the service shutdown is achieved by
"STOPPING=1" (or termination). (see sd_notify(3)).

なるほどわからん。こういう時に役立つのはDeepL

man systemd.service -> deepl
1
2
3
4
5
サービスを実行する最大時間を設定します。この設定を行った場合、指定した時間を超えてサービスが稼動していると、サービスは終了し、障害状態になります。この設定は、Type=oneshot のサービスには影響を与えません。infinity」(デフォルト)を指定すると、実行時間の制限を設けません。

Type=notify のサービスが「EXTEND_TIMEOUT_USEC=...」を送信した場合、ランタイムが RuntimeMaxSec=を超えて延長される可能性がある。このメッセージの最初の受信は、RuntimeMaxSec=を超える前に行われなければならない。ランタイムが RuntimeMaxSec=を超えて延長されると、サービスマネージャは、サービスが "STOPPING=1 "でサービスを停止する(または終了する)まで、指定された間隔で "EXTEND_TIMEOUT_USEC=... "を繰り返すことを条件に、サービスの実行を継続することを許可する。(sd_notify(3)参照)。

www.DeepL.com/Translator(無料版)で翻訳しました。

なるほど、指定時間を超えると意図的に終了し障害状態になるからTypeoneshot以外でRestartAlwaysである場合、再起動するという感じか。
mastodon は定期的に sidekiq の再起動が必要になるといううわさを聞くので sidekiq 辺りは再起動するようにしておこうかな。

systemd をいじる

私の場合、sidekiq をdefault, mailers, pull, pushと全体を含むsidekiqに分けている。
万が一問題が起きてもいいため、sidekiq以外を再起動させる。

/etc/systemd/system/mastodon-sidekiq-default.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=mastodon-sidekiq
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=400"
Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 50 -q default -q push -q mailers -q pull -q scheduler
TimeoutSec=15
Restart=always

- RuntimeMaxSec=86400

[Install]
WantedBy=multi-user.target

秒単位を要求されてるので24h * 60m * 60s86400なので86400を指定

サービスを再読み込み、再起動すれば反映される。

terminal
1
2
sudo systemctl daemon-reload
sudo systemctl restart mastodon-sidekiq\*.service

参考

コメント