- - PR -
Apache access_logに書き込まれない
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-04-07 11:51
Apacheのaccess_logを1日1回access_log.YYYYMMDDにリネームしています。
(正確には、圧縮して、access_log.YYYYMMDD.gz) リネーム後、kill -HUP `cat /var/run/httpd.pid`しています。 (/etc/logrotate.d/httpdは、止めています) このスクリプトを実行後、access_logに書き込まれない状態(ファイル サイズが0バイトのまま)になります。 Permissionは正しく、手動で、kill -HUP `cat /var/run/httpd.pid`を 実行すると、access_logを書き始めます。 kill -HUP `cat /var/run/httpd.pid`の替わりに、/etc/init.d/httpd reload としても同じ現象になります。 スクリプトで(cronで)実行すると書き込まれず、手動で同じことを 実行すると書き込まれます。このような状態になる原因と、 "試しに"のレベルでも結構ですので、解決策を教えてください。 OS:Red Hat ES 4 Web Server:httpd-2.0.52-22.ent という環境です。 | ||||
|
投稿日時: 2006-04-07 12:32
その cron を実行しているユーザは?
cron を実行するユーザが httpd を kill する権限が無いか、"kill","cat" コマンドの実行PATHが無いかではないでしょうか? 試しに cron で /bin/kill -HUP `/bin/cat /var/run/httpd.pid` と指定してみてはいかがでしょう。(/bin だから大丈夫な気がするんですけど…) | ||||
|
投稿日時: 2006-04-07 12:43
rootですので、問題ないはずです。 試しに cron で /bin/kill -HUP `/bin/cat /var/run/httpd.pid` として みましたが、同じ現象になります。 | ||||
|
投稿日時: 2006-04-07 17:24
手動 :OK
シェル:NG CRON :NG と言うことなので、手動で実行した場合と、シェルで実行した場合で、 出力結果に何か差分はありますでしょうか? 因みに、 # sh -x シェルファイル名 で詳細な結果が得られます。 | ||||
|
投稿日時: 2006-04-07 18:48
こんばんは
${ServerRoot}/logs/error_log にはどんなログが書き込まれますか? 再起動などをかけたときには何らかのログが出力されるはずです。 とにかく現象を突き止めるためには情報を集めましょう! ついでに /var/log/cronや /var/log/messagesも確認してみたほうがいいとおもいます。 ちなみに ${ServerRoot}/bin/apachectl graceful で再起動をかけることもできます。 ひとつ気になったのは処理の順番はどうなっているのでしょうか? mv などでリネームした場合でもapacheはりネーム後のファイルに出力を続けます。 なので再起動がうまくかかっていなければリネーム後のファイルに追記されていますよ touchなどで新しいファイルを作っているけど元のファイルに出力は続けているなんてことになっていませんか? ちなみに私の場合は以下の順番で行なっています。 1.ログファイルをリネーム 2.apacheを再起動 apachectl graceful 3.リネーム後のファイルを圧縮 | ||||
|
投稿日時: 2006-04-07 23:14
「サイズが0バイトのまま」ということは、ファイルの再作成は行われているということですか? いずれにしても、手動でOK、シェルでNGであれば、シェルに何らかの問題があるのでしょう。
あと、特別な理由がないのであれば、 > kill -HUP `cat /var/run/httpd.pid` ではなく、 kill -USR1 `cat /var/run/httpd.pid` の方がいいですね。(apachectl graceful と同様) kill -HUP の場合は、接続中のユーザとのセッションは切断されてしまいますが、kill -USR1 の場合はフリーになったプロセスから順に再起動されるので、接続中のユーザとのセッションが切断されることはありません。 | ||||
|
投稿日時: 2006-04-08 01:40
個人的には、「一瞬たりとも切断することは絶対に許されない」という
事情がない限り、HUPで再起動したほうが管理がやりやすいと思うです。 USR1だと、ログの切り替えが*完了*したタイミングを知ることが難しく なりますので。 # ログの切り替えが「はじまった」タイミングなら楽なんですが。 | ||||
|
投稿日時: 2006-04-10 12:55
皆様、多くの情報ありがとうございました。
結論から言いますと解決しました。 ただ、原因が特定できておりません。 この点、たいへん申し訳なく思っております。 おそらく、ある特定の条件のときにプロセス再起動の 処理が通らなかったのだと思います。 今はスクリプト(処理順も含め)を見直し、シンプル にしましたので、必ず通ります。 提供していただいた問題の切り分け方と追いかけ方は とても参考になりました。 kill -HUP と kill -USR1 の違いも理解できました。 皆様、ありがとうございました。 |
1