sysv init から systemd への変換用のカスタム スクリプト

sysv init から systemd への変換用のカスタム スクリプト

RedHat サーバーの前後のヘルス チェックを実行するために使用されるスクリプトがあり、このスクリプトは RHEL 6 で正常に動作しています。また、スクリプトを runlevel で構成して、再起動の前後にメールを送信するようにしました。今度は、同じことを RHEL 7 マシンで構成したいのですが、問題は、スクリプトを systemd で構成すると、再起動後のレポートのみが実行され、再起動前のステータスが実行されないことです。また、スクリプトを rhel 7 マシンで手動で実行すると、正常に動作します。したがって、スクリプトに問題はなく、カスタム スクリプトを systemd に設定するときに不足している構成があるはずです。

以下は私のサンプル systemd 設定です:

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/customscript
Description=SYSV: Server Reboot
Before=shutdown.target
After=network.service
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/customscript start
ExecStop=/etc/rc.d/init.d/customscript stop

[Install]
WantedBy=multi-user.target

答え1

CentOS 7 VMで何かモックアップを作ってみましたが、うまく動作しているようです。カスタムスクリプト起動、停止、再起動、およびステータス (/var/tmp/custom.out) 時にファイルにエコーするだけです。いくつかの小さな違いがあります。"[Unit]" スタンザには "After=network.service" がありますが、私は "After=network-online.target" と "After=remote-fs.target" を使用しています。また、"Wants=network-online.target" も追加しました。もう 1 つの違いは、スクリプトがバックグラウンドで実行されるデーモンではないと想定しているため、"[Service]" スタンザの "Type=forking" を "Type=simple" に変更したことです。

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/customscript
Description=LSB: Start daemon at boot time
Before=shutdown.target
After=remote-fs.target
After=network-online.target
After=postfix.service
Wants=network-online.target

[Service]
Type=oneshot
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/customscript start
ExecStop=/etc/rc.d/init.d/customscript stop

[Install]
WantedBy=multi-user.target

参考までに、私の /etc/rc.d/init.d/customscript ファイルは次のとおりです。

#!/bin/bash
### BEGIN INIT INFO
# Provides:          customscript
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

# Using the lsb functions to perform the operations.
. /lib/lsb/init-functions

case $1 in
    start)
        echo "Custom Start at $(date)" >> /var/tmp/custom.out
        ;;
    stop)
        echo "Custom Stop at $(date)" >> /var/tmp/custom.out
        ;;
    restart)
        echo "Custom Restart at $(date)" >> /var/tmp/custom.out
        ;;
    status)
        echo "Custom Status at $(date)" >> /var/tmp/custom.out
        ;;
    *)
        echo "Custom other at $(date)" >> /var/tmp/custom.out
        ;;
esac

以下は /var/tmp/custom.out です。13:04 にシャットダウンし、数分待ってから起動しました。さらに 20 分後にもう一度シャットダウンを実行し、さらに 2 分強待ってから再度起動しました。

Custom Stop at Thu Jun  1 13:04:37 PDT 2017
Custom Start at Thu Jun  1 13:10:39 PDT 2017
Custom Stop at Thu Jun  1 13:30:07 PDT 2017
Custom Start at Thu Jun  1 13:32:45 PDT 2017

しかし、システムがシャットダウンするまでにスクリプトが完了していないことが問題である可能性もあるのではないかと思います。

関連情報