web-dev-qa-db-ja.com

`fuser -k -n tcp 80`をbashスクリプトに書き込む方法は?

最近、私のサイトの訪問者数が急増しました。私の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スクリプトを作成しようとしています。

一部のページをcurlingしても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それ以外の場合。

2
cj333

ポート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を使用してください。

3
slm