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}"