ฆ่ากระบวนการด้วยการใช้งาน CPU สูงหลังจากเวลา X? [ปิด]


21

ใช้ Linux ฉันมีกระบวนการบางอย่างที่มักจะผิดพลาดเป็นครั้งคราว (เซิร์ฟเวอร์เกม) ซึ่งใช้ซีพียู 100%

ฉันกำลังมองหาโปรแกรมหรือสคริปต์เพื่อตรวจสอบการใช้ซีพียูของรายการกระบวนการตามชื่อและถ้าพวกเขาอยู่ที่ 100% นานกว่า X เวลา 30 วินาทีพูดฆ่าพวกเขา ฉันลองใช้ ps-watcher แต่ไม่สามารถระบุได้ว่าจะทำสิ่งนี้ได้อย่างไร

เพียงแค่ฆ่ากระบวนการที่การใช้งาน 100% จะไม่ทำงานเพราะจะกระทบกับช่วงเวลาสั้น ๆ ในระหว่างการทำงานปกติ

ฉันได้พบสคริปต์นี้ซึ่งดูเหมือนว่าจะทำสิ่งที่ฉันต้องการ แต่มันถูก จำกัด เพียงหนึ่งกระบวนการ: การเชื่อมโยง

ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก!


คุณช่วยกรุณาโพสต์ลิงค์ไปยังสคริปต์อีกครั้งได้หรือไม่เพราะpastebin.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 ของเอกสาร


ขอบคุณสำหรับการตอบกลับ! มีวิธีใดบ้างในการตรวจสอบกระบวนการโดยไม่ต้องเริ่มด้วย monit? ฉันมีเซิร์ฟเวอร์จำนวนมากที่ทำงานบนเครื่องที่จัดการผ่านเว็บอินเตอร์เฟสต้องเปิดใช้งานด้วย monit ไม่เหมาะ
user30153

แน่นอนว่าstart programและstop programสายเป็นเพียงกรณีเมื่อmonitจำเป็นต้องเริ่มกระบวนการของคุณ คุณยังสามารถเริ่มต้นด้วยสคริปต์เริ่มต้นตามปกติของคุณ monitสามารถตรวจสอบว่าโปรแกรมกำลังทำงานอยู่ (เช่นโดยไฟล์ PID หรือชื่อกระบวนการ)
joschi

เยี่ยมมากฉันคิดว่าฉันเข้าใจแล้ว ปัญหาเดียวก็คือมันขึ้นอยู่กับไฟล์ pid ฉันจะต้องสร้างหนึ่งสำหรับกระบวนการกว่า 200 กระบวนการและสร้างกฎสำหรับแต่ละอันที่ฉันคิด ขอบคุณสำหรับความช่วยเหลือ!
user30153

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
สิ่งนี้จะไม่เกิดสถานการณ์ที่กระบวนการหนึ่งจะถูกทำให้เต็มบนเซิร์ฟเวอร์มัลติคอร์
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.