ロード平均が高い場合、Apacheを自動的に再起動する

ロード平均が高い場合、Apacheを自動的に再起動する

私のサーバーは、高い負荷平均に達すると常にシャットダウンされます。 Apache、MySQLを最適化しました。しかし、交通量が多いところでは止められません。それで、負荷平均を制御するためにシェルを書いてみました。

#!/bin/bash
check=`uptime | sed 's/\./ /' | awk '{print $10}'`
if[$check -gt 5]
then
  /usr/bin/systemctl restart httpd.service
fi

ただし、スクリプトを許すとエラーが報告されます。

/var/www/html/load_average.sh: line 3: if[0.98, -gt 5]: command not found
/var/www/html/load_average.sh: line 4: syntax error near unexpected token `then'
/var/www/html/load_average.sh: line 4: `then'

もう一つ質問、cronjobを使用して10秒ごとにスクリプトを実行する方法は?

誰とでも共有できる別の作業コード:

#!/bin/bash
check=$(uptime | tr -d ',' | awk '{print $10}')
if [[ $check > 5 ]]; then
  /usr/bin/systemctl restart httpd.service
fi

cronjobセクションで

* * * * * /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 10; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 20; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 30; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 40; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 50; /var/www/html/load_average.sh >/dev/null 2>&1

答え1

次のように、スペースを使用してデータと角括弧を区切る必要があります。

for I in 0 1 2 3 4 5; do
    check=$(uptime | tr -d ',.' | awk '{print $10}')
    if [ "$check" -gt 5 ]; then
        /usr/bin/systemctl restart httpd.service
    fi
    sleep 10
done

UNIXでは[シェルコマンド。シェルが$check変数をその値に置き換えると、結果コマンドを見つけようとするとエラーが発生します。また、$check変数を空の文字列やスペースで置き換えたように引用することをお勧めします。これにより構文エラーが発生します。

crontab の問題に関連して、次を実行します。クローンタップ-eファイルに次の項目を追加します。

* * * * * /PATH/TO/YOUR/SCRIPT

Cronjobの最小チェック実行時間は1分なので、ループを使用して10秒ごとに6回確認を繰り返す必要があります。

答え2

if[0.98, -gt 5]

Bashは浮動小数点演算を実行できません。これを行うことができますif (( 98 > 500 ))。二重括弧は算術if (( check > 500 ))式を受け入れ、変数の拡張は自動的に行われます $check

#!/bin/bash
check=$(LC_ALL=C uptime | awk '{print 100*$10 }')
if (( check > 5 ))
then
  /usr/bin/systemctl restart httpd.service
fi

バックティックは長い間使用されなくなりました。

ただし、あまりにも忙しくてWebサーバーを再起動すると、訪問者が迷惑になり、平均負荷が低くなる可能性があります。タスクを追加するため、正しい解決策に固定されません。おそらく、プロファイラがボトルネックを見つけるのに役立ちます。

おそらく、Webサーバーによって引き起こされる可能性がある負荷平均を制限するより良い方法は、プロジェクト内にあります。私はシェルスクリプトを改善する方法の提案だけを提供できます。

LC_ALL設定はマイコンピュータでのみ必要です。このコンピュータはデフォルトでドイツ環境に設定されており、0.83を0,83と表示します。しかし、間違った言葉ではない。

関連情報