X 시간 후에 CPU 사용량이 많은 프로세스를 종료 하시겠습니까? [닫은]


21

Linux를 실행하는 동안 때때로 충돌하는 경향이있는 몇 가지 프로세스 (게임 서버)가 있는데, 이는 100 % CPU를 사용합니다.

프로세스 목록의 CPU 사용량을 이름으로 확인하는 프로그램이나 스크립트를 찾고 있는데 30 초 동안 X 시간 이상 100 %이면 프로세스를 종료하십시오. 나는 ps-watcher를 시도했지만 이것을 달성하는 방법을 결정할 수 없었습니다.

100 % 사용량으로 프로세스를 종료하면 정상 작동 중에 짧은 시간 동안 프로세스가 종료되므로 작동하지 않습니다.

나는 또한 내가 원하는 것을하는 것처럼 보이는이 스크립트를 찾았지만 하나의 프로세스로 제한됩니다 : 링크

어떤 도움이라도 대단히 감사합니다!


binbin.com/m1c814cb4가 더 이상 유효하지 않은 것으로 보이는 스크립트에 대한 링크를 다시 게시 할 수 있습니까?

Minecraft 서버를 실행하고 있다고 추측해도됩니까? ;)
PhonicUK

@Chris S 당신은 둔하다. 이것은 매우 흥미로운 질문입니다. "저품질, 의견이 많고 스팸으로 답변을 받고 답변이 빨리 폐기되기 때문에 귀하의 주장에 대한 출처를 제공 할 수 있습니까?" 이 질문에 대한 기존 답변이 어떻게 적용되는지에 대한 예를 들어 줄 수 있습니까? 숨을 참고 있지 않습니다.
db

답변:


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 's documentation 에서 찾을 수 있습니다 .


회신 주셔서 감사합니다! monit으로 시작하지 않고 프로세스를 모니터링 할 수있는 방법이 있습니까? 웹 인터페이스를 통해 관리되는 컴퓨터에서 많은 서버가 실행 중이므로 monit으로 시작 해야하는 것은 이상적이지 않습니다.
user30153 2009

물론, start programstop program라인은 monit프로세스를 다시 시작해야 할 경우에만 해당 됩니다. 여전히 일반적인 init 스크립트로 시작할 수 있습니다. monit프로그램이 이미 실행 중인지 확인할 수도 있습니다 (예 : PID 파일 또는 프로세스 이름).
joschi 2009

환상적이라고 생각합니다. 유일한 문제는 pid 파일에 의존한다는 것입니다. 200 개가 넘는 프로세스에 대해 하나를 생성하고 각 프로세스마다 규칙을 만들어야합니다. 도와 주셔서 감사합니다!
user30153 2009

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
Glutanimate

1
CPU가 90 % 인 경우 CPU_LOAD는 무엇입니까? 임계 값을 어떻게 계산합니까? 감사합니다
Ofir Attia

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.