検証目的で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