SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場

Nginx+PerlのCGI環境にMovable Typeをインストールする一撃シェルスクリプト

ツールがなくてもサーバー構築でだじろがない! 一撃シェルスクリプト道場 第2回

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

ダウンロード ICHIGEKI (6.9 KB)

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

次のページ
デーモンの自動起動設定、パッケージのアップデート、再起動

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場連載記事一覧

もっと読む

この記事の著者

濱田 康貴(ハマダ ヤスタカ)

サーバーエンジニアとして主にLinuxのWEBサーバーを設計、構築、運用を行っています。運用ツールの相棒としてシェルスクリプトやワンライナーは心強いパートナーと信じて疑わず、ブログでTIPSを公開しています。2009年5月のUSP友の会活動開始より参画し、現副会長。最近では、USP友の会で「一撃サーバー構築シェルスクリプト勉強会」を開催しているほか、日本で唯一のシェルスクリプト総合誌『シェルスクリプトマガジン』(毎月25日発売)で、隔月(偶数月号)連載「教えて先輩 サーバー運用お助けTips」を執筆しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8517 2015/04/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング