$ 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の起動スクリプトを用意する必要性はないと思うが。