perl-fastcgiのinitスクリプトの作成
perl-fastcgiのinitスクリプトと、ここから呼び出されるfastcgi-wrapper.plスクリプトをwww.linode.com からダウンロードします。これら2つのスクリプトは、linodeのドキュメント およびgithubのドキュメント で公開されています。
2つのスクリプトのうち、呼び出される側のfastcgi-wrapper.plは特に手を加えることなく動作するので、curlでダウンロードしてから実行権を付与しておしまいです。
## fastcgi-wrapper.pl Download curl -L -o /usr/bin/fastcgi-wrapper.pl http://www.linode.com/docs/assets/642-fastcgi-wrapper.sh chmod 700 /usr/bin/fastcgi-wrapper.pl
一方、perl-fastcgiのinitスクリプトには手を加える箇所がいくつかあります。次のコードは、perl-fastcgiのinitスクリプトをダウンロードし、それに16個のsedコマンドで手を加えています。
## perl-fastcgi initscript Download and edit
PERLFCGIDAEMON=/etc/rc.d/init.d/perl-fastcgi
curl -L -o ${PERLFCGIDAEMON} http://www.linode.com/docs/assets/641-init-rpm.sh
chmod 700 ${PERLFCGIDAEMON}
sed -i '/^#[[:space:]][ndpc][gerio]*/d' ${PERLFCGIDAEMON}
sed -i '2s/^#$/# perl-fastcgi/' ${PERLFCGIDAEMON}
sed -i '3s/^#$/# description: this script starts and stops the perl-fastcgi daemon/' ${PERLFCGIDAEMON}
sed -i "3a # chkconfig: - 85 15" ${PERLFCGIDAEMON}
sed -i s/^nginx=[\"\/[:alnum:]]*/perlfastcgi='"\/usr\/bin\/fastcgi-wrapper.pl"'/ ${PERLFCGIDAEMON}
sed -i 's/prog=\$(basename \$nginx)/prog=\$\(basename perl\)/' ${PERLFCGIDAEMON}
sed -i s/^NGINX_[[:alnum:]_=\"\\./]*// ${PERLFCGIDAEMON}
sed -i 's/lockfile=\/var\/lock\/subsys\/nginx/lockfile\=\/var\/lock\/subsys\/perl-fastcgi/' ${PERLFCGIDAEMON}
sed -i 's/\[ -x $nginx ] || exit [0-9]/[ -x $perlfastcgi ] || exit 5/' ${PERLFCGIDAEMON}
sed -i 's/\[ -f $NGINX_CONF_FILE ] || exit [0-9]//' ${PERLFCGIDAEMON}
sed -i 's/daemon $nginx -c $NGINX_CONF_FILE/daemon $perlfastcgi/' ${PERLFCGIDAEMON}
sed -i 's/configtest || return $?//g' ${PERLFCGIDAEMON}
sed -i 's/killproc $nginx -HUP/stop ; start/' ${PERLFCGIDAEMON}
sed -i '60,62d' ${PERLFCGIDAEMON}
sed -i 's/restart|configtest/restart/' ${PERLFCGIDAEMON}
sed -i "95s/|configtest//" ${PERLFCGIDAEMON}
ここでは、initスクリプトに手を加えている16個のsedコマンドの処理を解説します(以下の①~⑯)。逐次実行するようにして解説しますが、もちろん実際には一気に実行されます。あくまで処理を確認するためのイメージとしてお読みください。
①行頭のdescriptionを修正するためにいったん削除する
sed -i '/^#[[:space:]][ndpc][gerio]*/d' ${PERLFCGIDAEMON}
このsedコマンドを実行する前のinitスクリプトはこのようになっています。
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'
# nginx – this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /opt/nginx/conf/nginx.conf
# pidfile: /opt/nginx/logs/nginx.pid
置換後はこれらdescriptionが一気に削除されます。
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'
(何も表示されない)
②・③descriptionがないのも不都合なので追加する
とはいえ、descriptionがないのも不都合なので追加しています。2行目と3行目に「#」のみが書かれている空のコメント行があったので、ここに文字列を追加します。
sed -i '2s/^#$/# perl-fastcgi/' ${PERLFCGIDAEMON}
sed -i '3s/^#$/# description: this script starts and stops the perl-fastcgi daemon/' ${PERLFCGIDAEMON}
それでは確認してみましょう。
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'
# perl-fastcgi
# description: this script starts and stops the perl-fastcgi daemon
④3行目にあるdescriptionの直下に「# chkconfig: - 85 15」を追加する
sed -i "3a # chkconfig: - 85 15" ${PERLFCGIDAEMON}
このsedコマンド実行後の確認結果は次のようになります。
# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'
# perl-fastcgi
# description: this script starts and stops the perl-fastcgi daemon
# chkconfig: - 85 15
⑤「nginx="/opt/nginx/sbin/nginx"」を「perlfastcgi="/usr/bin/fastcgi-wrapper.pl"」に直す
sed -i s/^nginx=[\"\/[:alnum:]]*/perlfastcgi='"\/usr\/bin\/fastcgi-wrapper.pl"'/ ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep '^(nginx=|perlfastcgi)'
nginx="/opt/nginx/sbin/nginx"
実行後、変数名がnginxからperlfastcgiに、変数の中身も/opt/nginx/sbin/nginxから/usr/bin/fastcgi-wrapper.plに変わりました。
# cat ${PERLFCGIDAEMON} | egrep '^(nginx=|perlfastcgi)'
perlfastcgi="/usr/bin/fastcgi-wrapper.pl"
⑥「prog=$(basename $nginx)」を「prog=$(basename perl)」に直す
sed -i 's/prog=\$(basename \$nginx)/prog=\$\(basename perl\)/' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep '^(prog=)'
prog=$(basename $nginx)
sedコマンド実行後、prog変数の中身がnginxからperlに置換されました。
# cat ${PERLFCGIDAEMON} | egrep '^(prog=)'
prog=$(basename perl)
⑦「NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"」で始まる行を削除する
sed -i s/^NGINX_[[:alnum:]_=\"\\./]*// ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep '(^NGINX_[[:alnum:]_=\"\\./]*)'
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
sedコマンド実行後は「NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"」が削除されました。
# cat ${PERLFCGIDAEMON} | egrep '(^NGINX_[[:alnum:]_=\"\\./]*)'
(何も表示されない)
⑧「lockfile=/var/lock/subsys/nginx」を「lockfile=/var/lock/subsys/perl-fastcgi」に直す
sed -i 's/lockfile=\/var\/lock\/subsys\/nginx/lockfile\=\/var\/lock\/subsys\/perl-fastcgi/' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep '^(lockfile=)'
lockfile=/var/lock/subsys/nginx
sedコマンド実行後は、lockfile変数の中身がnginxからperl-fastcgiに変わりました。
# cat ${PERLFCGIDAEMON} | egrep '^(lockfile=)'
lockfile=/var/lock/subsys/perl-fastcgi
⑨start関数の中の「 [ -x $nginx ] || exit 5 」 を 「 [ -x $perlfastcgi ] || exit 5 」に直す
sed -i 's/\[ -x $nginx ] || exit [0-9]/[ -x $perlfastcgi ] || exit 5/' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -x \\\$[np][[:alpha:]]* \] \|\| exit [0-9])"
[ -x $nginx ] || exit 5
sedコマンド実行後は、testコマンドの条件式が、「もしnginxが実行可でなければ」から「もしperl-fcgiが実行可でなければ」に書き換わりました。
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -x \\\$[np][[:alpha:]]* \] \|\| exit [0-9])"
[ -x $perlfastcgi ] || exit 5
⑩start関数の中の 「 [ -f $NGINX_CONF_FILE ] || exit 6 」 を削除する
sed -i 's/\[ -f $NGINX_CONF_FILE ] || exit [0-9]//' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -f \\\$NGINX_CONF_FILE \] \|\| exit [0-9])"
[ -f $NGINX_CONF_FILE ] || exit 6
sedコマンド実行後は、nginxの設定ファイルがなければステータス6で終了する処理の行が削除されました。
# cat ${PERLFCGIDAEMON} | egrep "^(\[ -f \\\$NGINX_CONF_FILE \] \|\| exit [0-9])"
(何も表示されない)
⑪start関数の中の「daemon $nginx -c $NGINX_CONF_FILE」を「daemon $perlfastcgi」に直す
sed -i 's/daemon $nginx -c $NGINX_CONF_FILE/daemon $perlfastcgi/' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep "^(daemon)"
daemon $nginx -c $NGINX_CONF_FILE
sedコマンド実行後は、デーモンとして動かすコマンドがnginxからfastcgi-wrapper.plに変わりました。
# cat ${PERLFCGIDAEMON} | egrep "^(daemon)"
daemon $perlfastcgi
⑫restart関数とreload関数の中から「configtest || return $?」を削除する
sed -i 's/configtest || return $?//g' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep "(configtest \|\| return \\\$\?$)"
configtest || return $?
configtest || return $?
sedコマンド実行後はこれらの行が削除されました。
# cat ${PERLFCGIDAEMON} | egrep "(configtest \|\| return \\\$\?$)"
(何も表示されない)
⑬reload関数内の「killproc $nginx -HUP」を「stop ; start」に直す
sed -i 's/killproc $nginx -HUP/stop ; start/' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep "^(killproc \\\$nginx -HUP|stop ; start)"
killproc $nginx -HUP
sedコマンド実行後は、reload関数実行時の動作が「killproc $nginx -HUP」から「stop ; start」に変わりました。
# cat ${PERLFCGIDAEMON} | egrep "^(killproc \\\$nginx -HUP|stop ; start)"
stop ; start
⑭60〜62行目にある「configtest」を関数ごと削除する
sed -i '60,62d' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat -n ${PERLFCGIDAEMON} | grep -A 2 configtest\(\)
60 configtest() {
61 $nginx -t -c $NGINX_CONF_FILE
62 }
sedコマンド実行後は、これら3行(configtest関数実行部分)が削除されました。
# cat -n ${PERLFCGIDAEMON} | grep -A 2 configtest\(\)
(何も表示されない)
⑮case文の中で引数にrestartとconfigtestを与えたときの条件を、restartのみに変更する(configtest関数を削除したため)
sed -i 's/restart|configtest/restart/' ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat ${PERLFCGIDAEMON} | egrep -A 2 '(^restart[[:alnum:]|)]*$)' | tail -n 3
restart|configtest)
$1
;;
sedコマンド実行後は、case文の引数判定がrestartのみに変更されました。
# cat ${PERLFCGIDAEMON} | egrep -A 2 '(^restart[[:alnum:]|)]*$)' | tail -n 3
restart)
$1
;;
⑯95行目にあるUsageの行から「configtest」を削除する
sed -i "95s/|configtest//" ${PERLFCGIDAEMON}
上記sedコマンド実行前はこういう状態です。
# cat -n ${PERLFCGIDAEMON} | grep Usage | grep \|configtest\}\"
95 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
sedコマンド実行後は、末尾のconfigtestが削除されました。
# cat -n ${PERLFCGIDAEMON} | grep Usage
95 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
