2010年11月13日土曜日

Apacheのlogrotate時にApacheが停止する問題


ずいぶん前からなのですが、Apacheのlogrotate後に本来再起動するはずが再起動しない問題がありました。



具体的な症状



  • Apacheのlogrotate後に再起動しない

  • logrotateはされている

  • プロセスを見るとApacheは立ち上がっている

  • ブラウザからHTTPにアクセスできない

  • ログを見るとApacheにSTOPシグナルが送られている



このような状況です。



原因


logrotate後にApacheにSTOPシグナルが送られ、その後ApacheにSTARTシグナルが送られているのですがSTOPでは停止しない時があったり、停止している間にSTARTシグナルが送られてきてエラーになっているようです。


特にアクセスが多い日に発生しているように見受けられましたのでメモリ解放にやや時間がかかるようです。



対策


STOPでは終了しないので、killしてApacheを強制終了させることにしました。



コード


apacheのlogrotate用のコードです。



概要


  • Apacheを強制終了する

  • 強制終了しない場合を考えて5秒まって5回繰り返す

  • 強制終了後、起動する

  • 起動しない場合メールを送る


準備

/etc/init.d/httpd を /usr/bin/ap にコピーしてください。




cp /etc/init.d/httpd /usr/bin/ap






/var/log/apache/*log {


rotate 30


daily


missingok


sharedscripts


postrotate


for max in $(seq 1 5)


do


HTTPD_P=`pgrep httpd | wc -l`


if [ "$HTTPD_P" != 0 ]


then


`/usr/bin/pkill httpd` > /dev/null


sleep 5s


elif [ "$HTTPD_P" = 0 ]


then


/usr/bin/ap start > /dev/null


break


fi


done


HTTPD_P=`pgrep httpd | wc -l`


if [ "$HTTPD_P" = 0 ]


then


echo Can Not Run HTTPD | mail -s HTTPD ALERT メールアドレス


fi



endscript


}





0 件のコメント:

コメントを投稿