killというskillを使ってみる(apacheが起動しないときとか)

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
実際にやったら「は?」ってなるけどね

この記事を三行にまとめると

apacheが起動しないだと!?
あわてなーいあわてなーい
やっちまいなー!
アクセス過多なんかでうっかりサーバーが落ちてしまうと、焦りますよね。

で、慌ててapacheを再起動じゃーとか思っていたら、うっかりapacheが起動に失敗したりして、さらに焦ることがある。

僕もこの前、そんな状況に陥りまして、若干焦りました。

apacheを起動しようとしたら、こんなエラーが出て、起動してくれないんすよ。

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down


簡単にいうと、その80番のポートはもう使われてるよみたいなことを言われているわけなんですが、とにかく起動しない。

こういうときはプロセスを確認して、80番のポートを使っているプロセスを強制的に止めてしまえば、だいたい解決するみたいです。僕もそれで解決しました。

慌てることはない。こんなの、数分もあればできる。



プロセスを調べる

プロセスを確認するには『ps』っていうコマンドを使えば良いんですが、同じような状況に悩まされていた人の解決法を見てみると、psよりも『lsof』っていうコマンドを使って調べている人が多いんですよね。正直よく分かんないんですが、何かこっちの方が使い勝手が良いのかなぁ?

ってことで、今回はそのlsofコマンドを使って調べてみます。ただし、これはデフォルトでサーバーに入っていない場合があるので、もし入ってなければインストールする必要がある。インストール自体はやむれば一発です。

//lsofのインストール
# yum install lsof

//プロセスの確認
# lsof -i | grep httpd

//実行結果の例
httpd     1161  apache・・・(略)

実行結果の一部を省略しちゃいましたが、ここで大事なのは『1161』っていう数字なので、まあ問題はないでしょう。

lsofコマンドでgrepしてるのは、今回はapacheに関わっている部分だけを確認できれば良かったからです。別にオプションとか何もつけずに、単にlsofってだけ書いて実行しても良いんですが、現在実行中のプロセスが全部表示されてしまうので、場合によっては必要箇所を探すのが面倒かもしれない。

ちなみに、今回の場合は80番のポートを使用しているプロセスが調べられれば良いので、ポートを指定してlsofすることもできます。

# lsof -i:80

たぶん、ほぼ同じ実行結果が得られます。SSLとか使ってる場合は、『# lsof -i | grep httpd』の実行結果は80番以外のポート(443番とか)のプロセスも出てくると思うんで、微妙に違うかもだけど。



プロセスを終了する

さっきの実行結果に出てきた『1161』ってのは、プロセスのIDになります。なので、このプロセスを終了させたければ、こんな感じにkillする。

# kill 1161

お手軽ですね。これで1161のプロセスは終了します。ためしにもう一度lsofで確認すると、このプロセスは出てこないはず。

もし、apache(httpd)に関するプロセスが一つじゃない場合は、あるだけ全部killする。そりゃあもうバイオハザードで迫り来るゾンビを端から撃ち殺すくらいの勢いでとにかくkillだ。やっちまいなー。

プロセスの終了が完了したら、改めてapacheを起動させる。無事に起動できれば感動の万歳を三唱すれば良いんじゃないかな。感動のあまり、プログレッシブにプロテインを飲んで「ワイは猿や……プログラマー猿や!」って叫びながらプロモーションビデオのごとくプロポーズしちゃっても良いよ。僕ならやらないけどね。僕なら、プロレタリアートらしく、お金をかけずにその辺をプロムナードするよ。






こういうのって、知ってればいざエラーが出ても焦ることはないんですけど、知らないと、ビビっちゃうよね。テスト環境しか動いてないような状況ならともかく、すでに運用しているウェブサービスが止まっちゃうと、一刻も早く復旧しなきゃっていう焦りで、余計にミスしちゃうこともある。あとで大量のクレームが来ちゃうかもと思うと、お腹も痛くなってくる。余計に作業に集中できない。デフレ・スパイラル(?)です。

案外こういうときこそ、熱いお茶でも飲んで一息入れてから作業に取りかかるくらいの図々しさがあっても、良いのかもしれないですね。まあ、本当にゆっくり茶ぁ飲んで悠々と対処してたら、いろんな人に怒られそうだけど^^;
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2014年09月12日 15:30:29
づや
apacheが子を残したままいかれた場合は、こんな感じでまとめてkillしたりしている

pgrep -f 'httpd' | xargs kill -9
2014年09月15日 00:45:31
まっち~(管理人)
>づやさん
ほうほう、なるほど。まとめてkillできる方法があったのね。
これは知りませんでした。ありがとうございます。今度killやるときは試してみたいと思います。