- PR -

Apache access_logに書き込まれない

1
投稿者投稿内容
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 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/04
投稿数: 56
投稿日時: 2006-04-07 12:32
その cron を実行しているユーザは?

cron を実行するユーザが httpd を kill する権限が無いか、"kill","cat" コマンドの実行PATHが無いかではないでしょうか?

試しに cron で /bin/kill -HUP `/bin/cat /var/run/httpd.pid` と指定してみてはいかがでしょう。(/bin だから大丈夫な気がするんですけど…)
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-04-07 12:43
引用:

かつさんの書き込み (2006-04-07 12:32) より:
その cron を実行しているユーザは?



rootですので、問題ないはずです。
試しに cron で /bin/kill -HUP `/bin/cat /var/run/httpd.pid` として
みましたが、同じ現象になります。
やまも
会議室デビュー日: 2006/03/08
投稿数: 9
お住まい・勤務地: 東京
投稿日時: 2006-04-07 17:24
手動 :OK
シェル:NG
CRON :NG
と言うことなので、手動で実行した場合と、シェルで実行した場合で、
出力結果に何か差分はありますでしょうか?

因みに、
# sh -x シェルファイル名
で詳細な結果が得られます。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 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.リネーム後のファイルを圧縮

あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 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 の場合はフリーになったプロセスから順に再起動されるので、接続中のユーザとのセッションが切断されることはありません。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-04-08 01:40
個人的には、「一瞬たりとも切断することは絶対に許されない」という
事情がない限り、HUPで再起動したほうが管理がやりやすいと思うです。
USR1だと、ログの切り替えが*完了*したタイミングを知ることが難しく
なりますので。
# ログの切り替えが「はじまった」タイミングなら楽なんですが。
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-04-10 12:55
皆様、多くの情報ありがとうございました。

結論から言いますと解決しました。
ただ、原因が特定できておりません。
この点、たいへん申し訳なく思っております。
おそらく、ある特定の条件のときにプロセス再起動の
処理が通らなかったのだと思います。
今はスクリプト(処理順も含め)を見直し、シンプル
にしましたので、必ず通ります。

提供していただいた問題の切り分け方と追いかけ方は
とても参考になりました。

kill -HUP と kill -USR1 の違いも理解できました。

皆様、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)