検証目的でproxyサーバでも構築するかと、何となく久々にUbuntuで構築を進めていたところ、起動スクリプトに新しい仕組みが。。。

# ls -la /etc/init.d/squid3
lrwxrwxrwx 1 root root 21 1月 31 2013 /etc/init.d/squid3 -> /lib/init/upstart-job

どうやら起動時間短縮の為にUbuntuやFedoraに採用されているSysVinitに代わる仕組みらしい。設定ファイルは”/etc/init”配下に配置されている。

# cat /etc/init/squid3.conf
# squid - SQUID HTTP proxy-cache
#

description     "HTTP proxy-cache"
author          "Chuck Short <zulcss@ubuntu.com>"

# The second "or" condition is to start squid in case it failed to start
# because no real interface was there.
start on runlevel [2345]
stop on runlevel [!2345]

respawn
normal exit 0

env CONFIG="/etc/squid3/squid.conf"
env SQUID_ARGS="-YC"

pre-start script
        if [ -f /etc/default/squid3 ]; then
                . /etc/default/squid3
        fi

        find_cache_dir () {
                w="     " # space tab
                res=`sed -ne '
                        s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
                        t end;
                        d;
                        :end q' < $CONFIG`
                [ -n "$res" ] || res=$2
                echo "$res"
        }

        find_cache_type () {
          w="   " # space tab
          res=`sed -ne '
            s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
            t end;
            d;
            :end q' < $CONFIG`
          [ -n "$res" ] || res=$2
          echo "$res"
        }

        cache_dir=`find_cache_dir cache_dir`
        cache_type=`find_cache_type cache_dir`

        if [ "$cache_type" = "coss" -a -d "$cache_dir" -a ! -f "$cache_dir/stripe" ] ||
           [ "$cache_type" != "coss" -a -d "$cache_dir" -a ! -d "$cache_dir/00" ]
        then
                /usr/sbin/squid3 $SQUID_ARGS -z -f $CONFIG
        fi
end script

script
        if [ -f /etc/default/squid3 ]; then
                . /etc/default/squid3
        fi

        umask 027
        ulimit -n 65535
        exec /usr/sbin/squid3 -N $SQUID_ARGS -f $CONFIG
end script

下記の記載が、runlevel単位での起動/停止を制御している部分で、case文でstart/stop/status…の分岐も不要になったようなので読みやすくなったかもしれないけど、問題発生時に追跡し辛いのでは?と感じてしまう。

start on runlevel [2345]
stop on runlevel [!2345]

ちなみに”/etc/init.d”配下のコマンドを直接実行したら怒られた。

# /etc/init.d/squid3 status
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service squid3 status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status squid3
squid3 start/running, process 12491

serviceコマンドを読んでみると、upstartジョブで管理されているスクリプトか否かを判断して実行しているようで、これだと怒られなかった。

# service squid3 status
squid3 start/running, process 12491

upstartジョブで管理されているサービスは、initctlコマンドで制御されているとのこと。

# ls -l /sbin/* | grep initctl
-rwxr-xr-x 1 root root   155512  1月 19  2013 /sbin/initctl
lrwxrwxrwx 1 root root        7  1月 19  2013 /sbin/reload -> initctl
lrwxrwxrwx 1 root root        7  1月 19  2013 /sbin/restart -> initctl
lrwxrwxrwx 1 root root        7  1月 19  2013 /sbin/start -> initctl
lrwxrwxrwx 1 root root        7  1月 19  2013 /sbin/status -> initctl
lrwxrwxrwx 1 root root        7  1月 19  2013 /sbin/stop -> initctl

ということで、下記の4種類のコマンドは全て同値の処理ということらしい。

# status squid3
squid3 start/running, process 12491
# initctl status squid3
squid3 start/running, process 12491
# service squid3 status
squid3 start/running, process 12491
# /etc/init.d/squid3 status
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service squid3 status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status squid3
squid3 start/running, process 12491

start/stop/status/restartなんてコマンドにパスが通ってしまうことに違和感を感じてしまうのは自分だけだろうか。serviceコマンドが出始めた時に不要なコマンドを作る人がいるものだなあ、と思ったのも束の間。update-rc.dコマンドのオプションを使うたびに調べる必要がなくなった、と歓迎するべきか。

この記事がまとまっていて素晴らしかったです。
Sysvinit

TOP