
(98)Address already in use: と出てapacheが再起動できない場合の対策
2018/05/11
apache の設定を行い再起動しようとすると、Address already in use というエラーが出ました。
調べてみると、他のプロセスが80番ポートを占有しているからとのこと。
再起動できないってのは都合がわるいので、その対策です。
Address already in use: 対策
再起動失敗とエラー内容
[default]
# /etc/init.d/httpd graceful
httpd not running, trying to start
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[/default]
他のプロセスが80番ポートを使用しているために apache がポートを使えないために起こるエラーらしい。
調査
ポートを使用しているプロセスの確認。
[default]
sudo lsof -i | grep http
httpd 21746 root 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21767 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21768 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21769 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21770 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21771 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21775 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21778 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21779 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21780 daemon 3u IPv4 747509 TCP *:http (LISTEN)
httpd 21781 daemon 3u IPv4 747509 TCP *:http (LISTEN)
[/default]
プロセスID:21746 ~ 21781までが apache を使っています。
プロセス停止、再起動
ということで、該当するプロセスを停止させます。
[default]
sudo kill -9 21746
sudo kill -9 21767
sudo kill -9 21768
sudo kill -9 21769
sudo kill -9 21770
sudo kill -9 21771
sudo kill -9 21775
sudo kill -9 21778
sudo kill -9 21779
sudo kill -9 21780
sudo kill -9 21781
[/default]
この状態で再度調査(sudo lsof -i | grep http)すると、何も出ません。
ちなみに、apache が停止しているので、ブラウザでアクセスすると当然ながら「404エラー」が出ます。
再起動したいだけなのになぁ…
最後に起動
[default]
/usr/local/apache2/bin/apachectl start
[/default]
これで再び起動するはずです。
なお、原因は『httpdが異常終了する等して古いhttpdプロセスが残っていること』とのことですが、手元にある(実験用)サーバは毎回この状態で、何故そうなるのかは現状ではまだわかりません。
もうちょっと探る必要があるかな…。
(おまけ)apacheの再起動コマンドについて
[default]
/etc/init.d/httpd restart
[/default]
↑ クライアントと接続中の httpd プロセスを停止してしまうため、クライアントとの通信が強制的に切断してしまう。
[default]
/etc/init.d/httpd graceful
[/default]
↑ graceful はすべてのクライアントとの通信が終了するまで再起動しません。
Webサーバなどを公開していて、httpdサービスの停止が出来ない場合はかなり効果的。
参考サイト
http://qiita.com/ysk24ok/items/ffe8d5d1479aaf5afeaa
http://owen11.hateblo.jp/entry/2013/12/03/122952