最近、私のウェブサイトへのトラフィックが急激に増加しました。私のApacheはクラッシュし続けます。 httpd/error_log には次のような行があります。
[Sun Apr 13 08:57:18 2014] [warn] child process 7792 still did not exit, sending a SIGTERM
[Sun Apr 13 08:57:20 2014] [error] child process 7925 still did not exit, sending a SIGKILL
...
来月にサーバーをアップグレードする予定です。それ以前は、5分ごとに確認するcrondジョブを使用してApacheを自動的に再起動するBashスクリプトを作成してみました。
curl
いくつかのページを呼び出しても200コードが返されない場合fuser -k -n tcp 80
と/etc/init.d/httpd restart
。
私はBashスクリプトをうまく書いていません。私は動作し、Apacheを再起動するいくつかのコードを見つけました。
#!/bin/bash
curl -I http://www.mydomain.com/some-empty-page 2>/dev/null \
| head -1 | grep -q " 200 OK"
if [ $? -eq 0 ]; then
echo ""
else
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
再起動する前にポート80を使用するすべてのタスクを終了するにはどうすればよいですか?
次の作業行を挿入します。
else fuser -k -n tcp 80
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
注:最初に他の場合にelse fuser -k -n tcp 80
実行してください。/etc/init.d/httpd restart
答え1
ポート80の使い方を誤解しているようです。ポート80でリッスンするデーモンは1つだけです。次に、着信要求をApacheワーカーデーモンに渡します。コマンドcurl
がHTTPステータス200を返さない場合は、再起動スクリプトを実行します。
開始されたが終了しないようにするApacheを処理するには、サービス停止/開始スクリプトに既に条項が必要です。
次のように実行された後でも、次のような事実が見つかった場合:
$ /etc/init.d/httpd stop
$ pgrep httpd
... returns process ID's...
その後、アプローチを少し変更することで、次のことができます。
$ /etc/init.d/httpd stop
$ pkill httpd
$ /etc/init.d/httpd start
しかし、私が言ったように。このようなことは本当にしてはいけません。サービススクリプト/etc/init.d/httpd
自体は、この状況を正しく処理するのに十分強力でなければなりません。
スクリプトの変更
私はあなたが持っているものを次のように修正しますが、そうでなければIMOをそのまま使用しても大丈夫です。
#!/bin/bash
response=$(curl --write-out %{http_code} --connect-timeout 5 \
--silent --output /dev/null http://www.mydomain.com/some-empty-page)
if [ $response -eq 200 ]; then
echo "All's well"
else
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
機能を終了するには、else句を変更してください。
else
/etc/init.d/httpd stop
pkill httpd
/etc/init.d/httpd start
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
たとえば、実行したい再起動の重大度に応じて、よりpkill
深刻な終了信号(SIGKILLとも呼ばれる-9
)を提供するように拡張できますが、私は前者から始めます。 Apacheの中断が発生した場合は、次にelse句を追加してください。 Apacheがまだ応答しない場合は、SIGKILLを使用してください。