systemdの自動再起動について
経緯
Systemdの自動再起動オプションの中で、RestartForceExitStatus
がよく分からなかったのでRestart
と合わせて検証した。
man
RestartForceExitStatus=
Takes a list of exit status definitions that, when returned by the main service process, will force automatic service restarts, regardless of the restart setting configured with Restart=. The argument format is similar to RestartPreventExitStatus=.
Restart =
の設定値に関係なく、サービスの自動再起動を強制できるらしい。
検証
rsyslogのunitファイルで検証してみます。
/usr/lib/systemd/system/rsyslog.service
Restart
まずはRestart=always
の動きを見てみる。
Serviceセクションを以下のように変更。
[Service] Type=notify Restart=always EnvironmentFile=-/etc/sysconfig/rsyslog ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS UMask=0066 StandardOutput=null
systemdステータスからpidを確認
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2020-09-02 23:41:50 PDT; 6h ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 90210 (rsyslogd) Tasks: 3 Memory: 1.0M CGroup: /system.slice/rsyslog.service mq90210 /usr/sbin/rsyslogd -n
pidを指定してkill
# kill 90210
pidが変わってるので再起動された。
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-03 05:53:25 PDT; 1min 35s ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 112674 (rsyslogd) Tasks: 3 Memory: 716.0K CGroup: /system.slice/rsyslog.service mq112674 /usr/sbin/rsyslogd -n
RestartForceExitStatus
RestartForceExitStatusはシグナル名かシグナルIDを指定するらしい。
今回はSIGSEGVでやってみる。
[Service] Type=notify RestartForceExitStatus=SIGSEGV EnvironmentFile=-/etc/sysconfig/rsyslog ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS UMask=0066 StandardOutput=null
先ほどと同じようにpidを確認
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-03 06:39:09 PDT; 4min 22s ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 116314 (rsyslogd) CGroup: /system.slice/rsyslog.service mq116314 /usr/sbin/rsyslogd -n
SIGSEGVでkill
kill -s SIGSEGV 116314
pidが変わってるので再起動された
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-03 06:44:17 PDT; 11s ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 116683 (rsyslogd) Tasks: 3 Memory: 792.0K CGroup: /system.slice/rsyslog.service mq116683 /usr/sbin/rsyslogd -n
Restart + RestartForceExitStatus
RestartとRestartForceExitStatusを組み合わせることもできるらしい。
[Service] Restart=on-success RestartForceExitStatus=SIGSEGV Type=notify EnvironmentFile=-/etc/sysconfig/rsyslog ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS UMask=0066 StandardOutput=null
Restart=on-success
は正常終了(終了コード0)した場合に再起動するオプション。
このように正常終了かつSIGSEGVが発生した場合に再起動する、といった柔軟なこともできるらしい。
pid確認
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-03 06:39:09 PDT; 4min 22s ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 116314 (rsyslogd) CGroup: /system.slice/rsyslog.service mq116314 /usr/sbin/rsyslogd -n
SIGSEGVでkill
kill -s SIGSEGV 116314
再起動された。
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-03 06:44:17 PDT; 11s ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 116683 (rsyslogd) Tasks: 3 Memory: 792.0K CGroup: /system.slice/rsyslog.service mq116683 /usr/sbin/rsyslogd -n