質問: logrotateでログの整理中、httpdの再起動で不具合 logrotateでログが整理された後、 httpサーバーが再起動されますが、 その後、webサイトが見れなくなります。 /etc/init.d/httpd status で見るとrunning ですが、止まっています。 /etc/init.d/httpd restart すると回復します。 /etc/logrotate.d/httpdの中の再起動部分でおかしくなっています。 /var/log/httpd/*log { missingok notifempty sharedscripts postrotate /bin/kill -hup `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true endscript } /bin/kill のところです。 毎回おかしくなる訳ではなく、たまになると言う頻度、httpd restart で回復します。 どういう対応すれば良いでしょうか。。
回答: がるです。いくつか補足っぽいものを。 んっと、killでの記載が「お決まり」との事なのですが。 いくつかの理由から、/etc/rc.dを使ったほうがよりよろしいかと思われます。 とりあえず端的に、各種デーモンは、いくつか起動方法があります。で、起動と終了(またはrestart)を「異なる手段で行う」と、異なる手段での起動/停止方法の同期を人間がいちいちとる必要があるために(かつ大抵は複数ファイルに渡るために)、結構面倒になります。 一方で、startとstopを同一のファイルから行えば、よっぽどのことが無い限り、大抵は「startと整合性の取れたstop」をすることが出来ます。 具体例としては。「つい」間違えて /bin/kill -hup `cat /var/run/httpd.pid 2>/dev/null` を /bin/kill `cat /var/run/httpd.pid 2>/dev/null` とやって停止させてしまうと。起動マクロによっては「pidファイルが残ったままだからまだ残プロセスがあるから起動しない」みたいな、ちょっと面倒な状況もおきえます(で、こんな簡単なことに「焦っているために」気づかないってのが世の常です(苦笑))。 一方で、同一のマクロでstartとstopを行えば、そのマクロでバグが無い限り、そういったトラブルは可能な限り防げるので。 また、技術の世界において「周りと一緒だから多分大丈夫」は厳禁です。理由は述べるまでもないのですが、基本的に「理由はきちんとした理論の上に立脚する」ものだからです。 あと、 > killとkillprocの使い訳が分りません。 > また、一旦終わらせて改めて開始する場合と -hupで再起動する場合の使い分けもわかりません。 ですが。killproc については、googleあたりで検索するといくつか出てきます。 killのhupについては、 http://www.linux.or.jp/jm/html/procps/man1/kill.1.html をご覧いただけるとよろしいかと。 通例「restartと概ね等価」な実装をすることが多いのですが、そのあたりは純粋にアプリ依存なので。