• このエントリーをはてなブックマークに追加

【CentOS7】起動スクリプトを実行すると勝手にsystemctlを使う件

  • このエントリーをはてなブックマークに追加

centos
zaco muraです。

以前【CentOS7】networkが起動しないでも触れましたが、CentOS7でプロセスを起動する時、起動スクリプトを実行しても勝手にsystemctlを使ってしまうということが起こります。
これは意外と厄介でトラブル切り分けの邪魔になったりするので、回避する方法をメモしておきます。

スポンサーリンク
Sponsords Link

前提:systemctlとは

CentOS7で採用された、サービス管理などの仕組みです。詳細はこのページなどをどうぞ。

意図せずsystemctlを使ってしまうパターン

CentOS7では通常以下のようなコマンドでサービスを起動します。(例ではnetworkを起動)

[root@server ~]# systemctl start network.service

これでうまく行くときはよいのですが、トラブルの切り分けが難しい場合があります。

そこで切り分けの方法として以下のように起動スクリプトを直接実行しますが、なぜかsystemctlを使ってしまいます。

[root@centos7 ~]# sh -x /etc/init.d/network start
~~~~ 中略 ~~~~
++ systemctl_redirect /etc/init.d/network start
++ local s
++ local prog=network
++ local command=start
++ local options=
++ case "$command" in
++ s='Starting network (via systemctl): '
++ '[' -n '' ']'
++ action 'Starting network (via systemctl): ' /bin/systemctl start network.service #### ★★
++ local STRING rc
++ STRING='Starting network (via systemctl): '
++ echo -n 'Starting network (via systemctl):  '
Starting network (via systemctl):  ++ shift
++ /bin/systemctl start network.service
++ success 'Starting network (via systemctl): '
++ '[' color '!=' verbose -a -z '' ']'
++ echo_success
~~~~~ 以下略 ~~~~~

※11行目あたりを見ると、/bin/systemctl start network.service を実行していることがわかります。

原因

こうなってしまう原因は、/etc/init.d/functions というスクリプトにあります。
このスクリプトは起動スクリプトが共通的に読み込むものです。
少し中を見てみましょう。

# cat /etc/init.d/functions
#---------------
# -*-Shell-script-*-
#
# functions     This file contains functions to be used by most or all
#               shell scripts in the /etc/init.d directory.
#

TEXTDOMAIN=initscripts

# Make sure umask is sane
umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

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
~~~~ 以下略 ~~~~

上記16行目に”$SYSTEMCTL_SKIP_REDIRECT”という変数があります。この変数が空文字である場合、この後で _use_systemctl=1 という処理が行われます。
この_use_systemctlという変数は、さらに以下の部分で判定されます。

# cat /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

上記を解説すると、$_use_systemctl変数が”1″である場合、systemctl_redirectという関数を実行し、exitするようになっています。
このsystemctl_redirect()関数を見てみると、、

# cat /etc/init.d/functions
systemctl_redirect () {
        local s
        local prog=${1##*/}
        local command=$2
        local options=""

        case "$command" in
        start)
                s=$"Starting $prog (via systemctl): "
                ;;
        stop)
                s=$"Stopping $prog (via systemctl): "
                ;;
        reload|try-reload)
                s=$"Reloading $prog configuration (via systemctl): "
                ;;
        restart|try-restart|condrestart)
                s=$"Restarting $prog (via systemctl): "
                ;;
        esac

        if [ -n "$SYSTEMCTL_IGNORE_DEPENDENCIES" ] ; then
                options="--ignore-dependencies"
        fi

        action "$s" /bin/systemctl $options $command "$prog.service"
}

いよいよ核心に迫ってきました。27行目で /bin/systemctl を叩いています。
このように、$SYSTEMCTL_SKIP_REDIRECT 変数が空文字であった場合、勝手にsystemctlを使ってしまうということがわかりました。

回避方法

ここまでで何となくおわかりだと思いますが、回避方法は簡単です。
$SYSTEMCTL_SKIP_REDIRECTに何か変数を代入してやればよいです。
以下は例です。

[root@centos7 ~]# SYSTEMCTL_SKIP_REDIRECT=enable sh -x /etc/init.d/network start
+ . /etc/init.d/functions
++ TEXTDOMAIN=initscripts
++ umask 022
++ PATH=/sbin:/usr/sbin:/bin:/usr/bin
++ export PATH
++ '[' 4524 -ne 1 -a -z enable ']'
++ '[' -z '' ']'
~~~~ 以下略 ~~~~

$SYSTEMCTL_SKIP_REDIRECTに”enable”という文字列を入れてやれば、_use_systemctlへの代入が行われないことがわかりました。
これで意図通り/etc/init.dのスクリプトを実行してくれます。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link