CPU/メモリ使用量が高すぎると、Bashスクリプトは自動的にプロセスを終了します。

CPU/メモリ使用量が高すぎると、Bashスクリプトは自動的にプロセスを終了します。

CPUおよび/またはメモリ使用量が80%に達すると、プロセスを終了するスクリプトを作成しました。これが発生すると、終了したプロセスのリストが生成されます。これを改善するにはどうすればよいですか?

while [ 1 ];
do 
echo
echo checking for run-away process ...

CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_USAGE_THRESHOLD=800
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)

if [ $CPU_USAGE -gt $CPU_USAGE_THRESHOLD] ; then
  kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
  kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
  kill -9 $TOPPROCESS
  echo system overloading!
  echo Top-most process killed $TOPPROCESS
      echo CPU USAGE is at $CPU_LOAD

else
    fi
    exit 0
    sleep 1;
    done

ベストアンサー1

はい推測する解決しようとしている問題は、時々問題が発生し、コアに永久に固定されているいくつかのプロセスがボックスで実行されていることです。

最初にすべきことは、問題を引き起こすプログラムを修復することです。これが最高のソリューションです。私はこれが不可能になるか、問題が解決されるまでボックスを実行し続けるためのクイックツールが必要だと仮定します。

少なくとも興味のある1つのプログラムだけを実行するようにスクリプトを制限したいと思います。権限がこのようにスクリプトを制限するのが最善です(たとえば、スクリプトがユーザーXで実行され、Xで実行される唯一のものはプログラムです)。

ulimit -tより良い方法は、プログラムが使用できる合計CPU時間を制限するなどのものを使用することです。繰り返しますが、すべてのメモリを消費する場合は、カーネルがこれらの制限を適用していることを確認してください。ulimit -v詳しくは、bashマンページ(シェル内蔵)とsetrlimit(2)マンページをご覧ください。

問題がランアウェイプロセスではありませんが、あまりにも多くのプロセスが実行されている場合は、X以上のプロセスが実行されないように任意の種類のロックを実装してください(または - 慣れているようですulimit -u)。また、これらのプロセスのスケジューラ優先順位を変更(niceまたは使用)するポリシーをに変更することをreniceより基本的に検討することもできます。sched_setschedulerSCHED_IDLE

さらに制御が必要な場合は、制御グループ(cgroups)を確認してください。実行中のカーネルに応じて、プロセス全体が消費するCPU時間、メモリ、I / Oなどの量を実際に制限できます。コントロールグループは非常に柔軟性があり、壊れやすい欠陥なしに必要なすべてのタスクを実行できます。 Arch Linux Wikiにはcgroupについて読む価値がある理由はNeil BrownのcgroupsシリーズLWNから。

おすすめ記事