Apacheにおける reload コマンドと graceful コマンドの動きを見てみようと思いましたので、下記のようなPHPスクリプトを作成してみました。
ブラウザからアクセスすると30秒待って《OK》が表示されます。
<?php sleep(30); echo "OK"; ?>
まずは reload を試す
reload は、『全ての処理中リクエストは終了される』とか聞きますが果たして?
とりあえずブラウザから test.php にアクセス。待ち状態に入ります。
そこですかさずサーバ側で reload を実施。
$ /etc/rc.d/init.d/httpd2 reload httpd を再読み込み中: [ OK ]
切れない…
少し想定と違いました。
どうやら切れないようです。
続いて graceful を試す
graceful は『プロセスが終わるのを待ってから新しい設定を反映させる』とか聞きますが果たして?
先ほどと同様にブラウザから test.php にアクセス。待ち状態に入ります。
そこですかさずサーバ側で graceful を実施。
$ /etc/rc.d/init.d/httpd2 graceful
あれ?
30秒待たずにいきなり《OK》が表示されました‥。
PHPログにも何も出力されていません。
どうやら子プロセス(sleep)が強制的に終了させられて次の処理に移り、処理完了となったみたいです。
結論
結論として、 graceful は子プロセスが強制的に終了させられて進む。
reload は終了まで待たされる。
という感じになりました。なるほど。
gracefulするとsleepが効かない原因を調べていたらここにたどり着きました。
“子プロセスが”というより”sleepが”無視されている感じなんですよねぇ…