[Terminal | ターミナル] TerminalからApacheをスタートするシェルスクリプト(Lion)

2012/03/10

こんにちは。きんくまです。

MacにはWebサーバーのApacheが最初から入っています。それで、そのメモです。
OSはlionです。

httpd.confの場所は以下にあります。設定が必要な場合はこれをいじればOKです。
/etc/apache2/httpd.conf

コマンドから起動

apachectlというコマンドがまず関係していて、man apachectlを見ると

NAME
       apachectl - Apache HTTP Server Control Interface

SYNOPSIS
       When  acting  in  pass-through  mode,  apachectl  can  take all the arguments available for the httpd
       binary.

       apachectl [ httpd-argument ]

とかなっています。パス通しモードだとhttpdに直接引数伝えるよ。となっているので、man httpdをひきます。httpdという名前はhttpを扱うデーモン(d) だと思われ。

NAME
       httpd - Apache Hypertext Transfer Protocol Server

SYNOPSIS
       httpd [ -d serverroot ] [ -f config ] [ -C directive ] [ -c directive ] [ -D parameter ] [ -e level ]
       [ -E file ] [ -k start|restart|graceful|stop|graceful-stop ] [ -R directory ] [ -h ] [ -l ] [ -L ]  [
       -S ] [ -t ] [ -v ] [ -V ] [ -X ] [ -M ] [ -T ]

長いオプションがあるのですが、今回関係するのは -k と -D のみです。

結論から先にいいますと以下のコマンドでTerminalからサーバーをスタートできます。
sudo使っているので、アカウントのパスワードがコマンド打った後から必要です。

sudo apachectl -D WEBSHARING_ON -k start

ストップしたいときは以下のコマンドです。

sudo apachectl -k stop

それで、WEBSHARING_ONというのはどこからきたかといいますと、
httpd.confの中にIfDefineではじまるWEBSHARING_ONという部分がありまして、
そいつを引っ張る必要があるようです。
このオプションを通せばそこからうまく設定を読みこんでくれるという感じです。

ちなみにGUIからだと
System Preference > Web Sharing
のチェックボックスを有効にしたり、無効にしたりすればOKです。

httpd-1

GUIから起動しているときに、httpdのプロセスを確認してみます。

kinkuma$ ps -ax | grep ht
 5958 ??         0:00.14 /usr/sbin/httpd -D FOREGROUND -D WEBSHARING_ON
 5961 ??         0:00.00 /usr/sbin/httpd -D FOREGROUND -D WEBSHARING_ON
 5996 ttys000    0:00.00 grep ht

こんな感じになっていて、 httpdというプロセスが WEBSHARING_ON というオプションつきで動いているのがわかります。 もうひとつのFOREGROUNDはhttpdのmanを見ると

       -D parameter
              Sets a configuration parameter which can be used with  sections in the configuration
              files to conditionally skip or process commands at server startup and  restart.  Also  can  be
              used  to  set certain less-common startup parameters including -DNO_DETACH (prevent the parent
              from forking) and -DFOREGROUND (prevent the parent from calling setsid() et al).

IfDefineのところをスキップするかそのまま進めるかを設定できます。
また-DNO_DETACHだと親からforkするのを防いだり、
-DFOREGROUNDだと親プロセスからsetsid()を呼ばれるのを防ぎます。
と書いてあるんだけど、このあたり今勉強中なのでまだよくわかりません、。

ちなみにコマンドからこの-DFOREGROUNDをつけてhttpdを起動したところ、その間だけコマンドの入力がかえらずに、サーバーが動いている状態になっていて、Ctrl+Cでコマンドを終了するとその場でサーバーも終了というふうになりました。たぶんマニュアルの通り、親からプロセスが切り離されていないためにこういう形になるってことかな?

シェルスクリプト

それで、今回のをシェルスクリプトにしたら便利だよなと思い作ってみました。

myapache

#!/bin/sh

starthttpd()
{
  sudo apachectl -D WEBSHARING_ON -k $1
}

stophttpd()
{
  sudo apachectl -k stop
}

if [ $# = 0 ] ; then
  echo "Usage: myapache [ start | restart | stop ]"
elif [ "$1" = "start" ] ; then
  starthttpd "start"
  echo "httpd is running..."
elif [ "$1" = "restart" ] ; then
  starthttpd "restart"
  echo "httpd restarted"
elif [ "$1" = "stop" ]; then
  stophttpd
  echo "httpd stopped"
fi

使い方としては、上の内容のmyapacheというテキストファイルを用意します。

/usr/local/bin

に移動して、実行権をつけます。

chmod 744 /usr/local/bin/myapache

こんな感じになっていれば大丈夫。うまくいかなかったらsudoとかつけてからコマンド入力するといいかも。

kinkuma$ ls -l /usr/local/bin/myapache
-rwxr--r--  1 kinkuma  admin  414 Mar 10 04:35 /usr/local/bin/myapache

ここまでで準備完了。
あとはスタートするときは、

myapache start

ストップするときは

myapache stop

再起動するときは

myapache restarrt

とコマンドを打てばOKです。


自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る