てきとうなメモ

本の感想とか技術メモとか

/etc/init.d/xxxを直接起動してもsystemctl経由になる

$ sudo /etc/init.d/hello start
Starting hello (via systemctl):                            [  OK  ]

従来のinit.dの起動スクリプト直接実行しても、こんな感じでsystemctl経由で起動される。

init.dの起動スクリプトは/etc/init.d/functionsで処理されている。/etc/init.d/functionsは起動スクリプトを実行する際の便利なシェル関数群だったのだが、CentOS7ではsystemctlへのリダイレクトも実施している。

if [ $PPID -ne 1 -a -z "$SYSTEMCTL_SKIP_REDIRECT" ] && \
                ( /bin/mountpoint -q /cgroup/systemd || /bin/mountpoint -q /sys/fs/cgroup/systemd ) ; then
        case "$0" in
        /etc/init.d/*|/etc/rc.d/init.d/*)
                _use_systemctl=1
                ;;  
        esac
fi

上記の部分で/etc/init.d/*や/etc/rc.d/init.d/*のスクリプトは_use_systemctlフラグを立てられる。

で、/etc/init.d/functionsの最後の方で

if [ "$_use_systemctl" = "1" ]; then
        if  [ "x$1" = xstart -o \
                "x$1" = xstop -o \
                "x$1" = xrestart -o \
                "x$1" = xreload -o \
                "x$1" = xtry-restart -o \
                "x$1" = xforce-reload -o \
                "x$1" = xcondrestart ] ; then

                systemctl_redirect $0 $1
                exit $?
        fi
fi

となりsystemctl_redirectを実行され、systemctl_redirectは

systemctl_redirect () {
        ...
        action "$s" /bin/systemctl $options $command "$prog.service"
}

とsystemctlを実行している。

というようなスクリプトになっているのでsystemctl経由で呼ばれないようにする方法はいくつかある。


環境変数SYSTEMCTL_SKIP_REDIRECTを1の設定して起動するのが一番正規の方法だろう。
また、処理が/etc/init.d/functions経由なので/etc/init.d/functionsを読み込んでいなければ、そのままのスクリプトとして実行される。
他にも、スクリプト名が/etc/init.d/*や/etc/rc.d/init.d/*でなければ実行されないので

$ cd /etc/init.d
$ sudo ./<サービス名> start

とかやっても、(systemctl関係なく)そのまま起動されるだけである。

ちなみにsystemctlの方でちゃんと設定している場合はinit.dの起動スクリプトは以下のようなものでも良い。

#!/bin/sh
. /etc/init.d/functions

まあ、systemd対応しているものにわざわざinit.dの起動スクリプトを用意する必要性はないと思うが。