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

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

最近、私のウェブサイトへのトラフィックが急激に増加しました。私の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を使用してください。

関連情報