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