最近、私のサイトの訪問者数が急増しました。私の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
ingしても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
それ以外の場合。
ポート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
を展開して、より厳しいkillシグナルを与えることができます(SIGKILL別名-9
)たとえば、前者から始めます。 Apacheのハングが発生した場合は、次にelse句を追加してください。それでもApacheがハングしたままになる場合は、SIGKILLを使用してください。