この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
apachectlのrestartやgraceful、
httpdのrestartやgraceful、
/etc/init.d/httpdのrestart…、
それぞれの微妙な違いをまとめました。
apachectl graceful httpd -k graceful※どちらも同じ。 apachectl gracefulを実行すると、内部でhttpd -k gracefulが呼ばれる(後述) | 子プロセスは現在のリクエストを処理した後、終了する。親プロセスは設定ファイルを再読み込みし、ログファイルを開き直す。子プロセスが徐々になくなり、替わりに新しい子プロセスが起動する。【注意点】 設定ファイルに誤りがあったり等で親プロセスが再起動せず終了した場合、 子プロセスが放置されたりする場合がある(→再起動時に問題となる可能性がある) ので、再起動前にhttpd -tで構文チェックをした方がよい。 |
---|---|
apachectl restart httpd -k restart※どちらも同じ。 apachectl restartを実行すると、内部でhttpd -k restartが呼ばれる(後述) | 子プロセスを即座にkill。親プロセスは終了しない。親プロセスは設定ファイルを再読み込みし、ログファイルを開き直す。その後新しい子プロセスを起動。→ログを見るとHUPシグナルが渡されたことが確認できます。 |
/etc/init.d/httpd restart※httpd -k restartとは別もの。 起動スクリプト内で定義されたstop→startが実行される。 | 子プロセスを即座にkillし、全て終了後、親プロセスも終了。(stop)その後起動。(start)→ログを見るとTERMシグナルが渡されたことが確認できます。※Apacheのインストールディレクトリがデフォルトと違う場合は、 /etc/init.d/httpd 内でhttpd実行ファイルの場所を修正する必要があります。 |
「apachectl restart」と「httpd -k restart」は同じ
apachectlに特定の引数を渡すと、内部で「httpd -k 引数」が実行されます。
特定の引数とは、
start | stop | restart | graceful | graceful-stop
です。
# less apachectl
-------------
・
・
case $ARGV in
start|stop|restart|graceful|graceful-stop)
$HTTPD -k $ARGV
ERROR=$?
;;
startssl|sslstart|start-SSL)
echo The startssl option is no longer supported.
echo Please edit httpd.conf to include the SSL configuration settings
echo and then use "apachectl start".
ERROR=2
;;
configtest)
$HTTPD -t
ERROR=$?
;;
status)
$LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '
;;
fullstatus)
$LYNX $STATUSURL
;;
*)
$HTTPD $ARGV
ERROR=$?
esac
exit $ERROR
-------------
これらの引数が渡された場合は、 httpdにそのまま引数が渡され
挙動は上記表のとおりとなります。
また、「apachectl restart」と「apachectl -k restart」も同じです。
「httpd -k restart」と「/etc/init.d/httpd restart」は別もの
どちらもhttpdを再起動しますが、処理プロセス(手続き)が異なるため挙動も異なります。
「httpd -k restart」は、httpdバイナリ(実行ファイル)内の処理によって、
「/etc/init.d/httpd restart」は、/etc/init.d/httpd(起動スクリプト)内の処理によって
再起動されます。
それぞれの処理内でkillの仕方が違う(渡されるシグナルが違う)ようで、
httpd -k restart | SIGHUP |
---|---|
/etc/init.d/httpd restart | SIGTERM |
/etc/init.d/httpd reload | SIGHUP |
となっているようです。
/etc/init.d/httpd は、httpd実行ファイルを起動するためのスクリプトファイルです。
手動インストール等でインストール場所が異なる場合は/etc/init.d/httpdを編集して
httpd実行ファイルの場所を修正する必要があります。
詳細は公式のドキュメントに記載されています。
https://httpd.apache.org/docs/2.2/ja/stopping.html