X時間後にCPU使用率が高いプロセスを強制終了しますか?[閉まっている]


21

Linuxを実行していると、時々クラッシュする傾向のあるいくつかのプロセス(ゲームサーバー)があり、100%CPUを使用することになります。

プロセスのリストのCPU使用量を名前で確認し、X時間(たとえば30秒)以上100%である場合、それらを強制終了するプログラムまたはスクリプトを探しています。私はps-watcherを試しましたが、これを達成する方法を決定することができませんでした。

100%の使用率でプロセスを強制終了するだけでは機能しません。通常の操作中に短時間停止するだけです。

また、私はそれが一つのプロセスに限定されているが、私がやりたいように見えるこのスクリプトを、見つけた:リンク

どんな助けも大歓迎です!


このスクリプトへのリンクを再度投稿してください。pastebin.com/ m1c814cb4はもう有効ではないようです。

Minecraftサーバーを実行していると推測するのは正しいでしょうか?;)
PhonicUK

@クリスSあなたは退屈です。これは非常に興味深い質問です。「質の低い、偏見のある、スパムの回答を引き付け、回答がすぐに陳腐化するため」という主張のソースを提供できますか?また、この質問に対する既存の回答がこれまでどのように機能するかについて、例を挙げていただけますか?私は息を止めていません。
デシベル

回答:


19

monitを試してください。

次のような構成を使用して、タスクを実行できます。

check process gameserver with pidfile /var/run/gameserver.pid
  start program = "/etc/init.d/gameserver start" with timeout 60 seconds
  stop program  = "/etc/init.d/gameserver stop"
  if cpu > 80% for 2 cycles then alert
  if cpu > 95% for 5 cycles then restart
  if totalmem > 200.0 MB for 5 cycles then restart
  if loadavg(5min) greater than 10 for 8 cycles then stop
  if failed port 12345 type tcp with timeout 15 seconds
    then restart
  if 3 restarts within 5 cycles then timeout

この設定に関する詳細は、monitのドキュメントにあります


返信してくれてありがとう!monitでプロセスを開始することなくプロセスを監視する方法はありますか?私はマシン上でWebインターフェースを介して管理される多数のサーバーを実行していますが、それらをmonitで起動することは理想的ではありません。
user30153 09

もちろん、start programとのstop program行はmonit、プロセスを再起動する必要がある場合にのみ当てはまります。通常のinitスクリプトで引き続き起動できます。monitプログラムがすでに実行されているかどうかも確認できます(たとえば、PIDファイルまたはプロセス名によって)。
joschi 09

素晴らしい、私はそれを理解したと思う。唯一の問題は、それがpidファイルに依存していることです。200を超えるプロセスに対して1つ生成し、各プロセスごとにルールを作成する必要があります。助けてくれてありがとう!
user30153 09

4

これは私が探していたものであり、しばらくの間それを使用していました(わずかに変更されました)。最近、仕事にバグを入れましたが、アプリ(ゲームサーバー)を実行し続ける必要があります。
間違ったPIDを殺していたため、最上位のPIDが殺された部分を引用しました。
これがスクリプトの最新のドラフトです。これまでのところ、最上位のオーバーロードを検出し、効果的にそれを殺します(何かを実行するたびに情報をメールで送信します)。

#!/bin/bash

## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...

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

if [ $CPU_LOAD -gt $CPU_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 load average is at $CPU_LOAD
  echo 
  echo Active processes...
  ps aux r

  # send an email using mail
  SUBJECT="Runaway Process Report at Marysol"
  # Email To ?
  EMAIL="myemail@somewhere.org"
  # Email text/message
  EMAILMESSAGE="/tmp/emailmessage.txt"
  echo "System overloading, possible runaway process."> $EMAILMESSAGE
  echo "Top-most process killed $TOPPROCESS" >>$EMAILMESSAGE
  echo "Load average was at $CPU_LOAD" >>$EMAILMESSAGE
  echo "Active processes..." >>$EMAILMESSAGE
  echo "$PROCESS" >>$EMAILMESSAGE
  mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE

else
 echo
 echo no run-aways. 
 echo load average is at $CPU_LOAD
 echo 
 echo Active processes...
 ps aux r
fi
exit 0


この小さなスクリプトは非常に便利です。プロセスを強制終了するのが気に入らない場合は、メールだけで情報を入手できます。


ご回答有難うございます!並べ替えTOPPROCESSがオフになっていることを指摘したいと思います。実際の値で並べ替えるのではなく、エントリをアルファベット順に並べ替えます(たとえば、6%が12%より優先されます)。より良い代替手段は次のコマンドですtop -b -n 1 | sed 1,6d | sed -n 2p
。–グルタニメート

1
CPUが90%の場合、CPU_LOADは何ですか?しきい値の計算方法は?ありがとう
Ofir Attia

1
これは、1つのプロセスがマルチコアサーバーで最大になっている状況をキャッチしません。
UpTheCreek

0

以下は、あなた自身のニーズについてのヒントを得るのに役立つサンプルBASHスクリプトです。

#!/bin/bash

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=700

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
  kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1)
fi

exit 0

$ CPU_THRESHOLDの値は、システムにある(CPU)コアの数に依存する必要があることに注意してください。このトピックに関する詳細な説明は、http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averagesにあります。

/ etc / inittab内からスクリプトを呼び出すことも、好きな時間ごとにcronjobを呼び出すこともできます。$ CPU_LOADが$ CPU_THRESHOLDよりも大きい場合、サンプルスクリプトは最上位プロセスを強制終了することにも注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.