Tiêu diệt quá trình sử dụng CPU cao sau thời gian X? [đóng cửa]


21

Chạy Linux Tôi có một vài quy trình có xu hướng thỉnh thoảng bị sập (máy chủ trò chơi), cuối cùng sử dụng cpu 100%.

Tôi đang tìm kiếm một chương trình hoặc tập lệnh để kiểm tra việc sử dụng cpu của danh sách các quy trình theo tên và nếu chúng ở mức 100% trong hơn thời gian X, hãy nói 30 giây, giết chúng. Tôi đã thử ps-watcher nhưng không thể xác định làm thế nào để thực hiện điều này.

Chỉ cần giết quá trình ở mức sử dụng 100% sẽ không hoạt động vì nó sẽ đạt được điều đó trong thời gian ngắn trong quá trình hoạt động bình thường.

Tôi cũng đã tìm thấy tập lệnh này dường như làm những gì tôi muốn, tuy nhiên nó bị giới hạn trong một quy trình: liên kết

Bất kỳ trợ giúp nào cũng được đánh giá rất cao!


Bạn có thể vui lòng gửi lại một liên kết đến tập lệnh vì điều này pastebin.com/m1c814cb4 dường như không còn hiệu lực nữa.

Tôi có thể đoán đúng rằng bạn đang chạy máy chủ Minecraft không? ;)
PhonicUK

@Chris S Bạn thật buồn tẻ. Đây là một câu hỏi rất thú vị. Bạn có thể cung cấp một nguồn cho khiếu nại của mình "bởi vì chúng thu hút các câu trả lời chất lượng thấp, gây tranh cãi và spam và các câu trả lời trở nên lỗi thời một cách nhanh chóng."? Và bạn có thể đưa ra một số ví dụ cho cách các câu trả lời hiện có cho câu hỏi này phù hợp với vấn đề này không? Tôi không giữ được hơi thở.
db

Câu trả lời:


19

Hãy thử monit .

Bạn có thể sử dụng một cấu hình như thế này để hoàn thành nhiệm vụ của mình:

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

Chi tiết về cấu hình này có thể được tìm thấy trong tài liệu của monit .


Cảm ơn bạn đã trả lời! Có cách nào để theo dõi quá trình mà không phải bắt đầu với monit không? Tôi có rất nhiều máy chủ đang chạy trên máy được quản lý thông qua giao diện web, việc phải khởi chạy chúng với mục đích không lý tưởng.
dùng49553

Chắc chắn, dòng start programstop programchỉ dành cho trường hợp khi monitcần khởi động lại quy trình của bạn. Bạn vẫn có thể bắt đầu nó với tập lệnh init bình thường của bạn. monitcũng có thể kiểm tra xem chương trình đã chạy chưa (ví dụ: bằng tệp PID hoặc tên tiến trình của nó).
joschi

Tuyệt vời, tôi nghĩ rằng tôi đã tìm ra nó. Vấn đề duy nhất là nó phụ thuộc vào tệp pid, tôi sẽ phải tạo một tệp cho hơn 200 quy trình và tạo quy tắc cho mỗi tệp mà tôi cho là. Cảm ơn đã giúp đỡ!
dùng49553

4

Đây là những gì tôi đang tìm kiếm và đã sử dụng nó một thời gian (thay đổi một chút). Gần đây, tôi đã đặt một lỗi trong công việc của mình nhưng cần phải duy trì ứng dụng (máy chủ trò chơi).
Tôi đã trích dẫn phần mà PID bị giết cao nhất, vì nó đã giết chết PID sai.
Đây là bản thảo mới nhất của tôi về kịch bản của bạn, cho đến nay, nó tìm thấy sự quá tải hàng đầu và giết chết nó một cách hiệu quả (cũng gửi email cho tôi với thông tin bất cứ khi nào nó làm bất cứ điều gì);

#!/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


Kịch bản nhỏ này cực kỳ hữu ích, nếu bạn không thích nó giết bất kỳ quy trình nào, chỉ riêng email sẽ giúp bạn thông báo.


Cảm ơn câu trả lời của bạn! Tôi chỉ muốn chỉ ra rằng sắp xếp của bạn TOPPROCESSlà tắt. Nó sẽ không sắp xếp theo giá trị thực tế, thay vào đó, nó sẽ sắp xếp các mục nhập chữ và số (ví dụ: 6% sẽ được ưu tiên hơn 12%). Một cách khác tốt hơn có thể là lệnh sau:top -b -n 1 | sed 1,6d | sed -n 2p
Glutimate

1
Nếu CPU là 90% thì CPU_LOAD là gì? và cách bạn tính ngưỡng? cảm ơn
Ofir Attia

1
Điều này sẽ không bắt được các tình huống trong đó một quá trình được tối đa hóa trên một máy chủ đa lõi.
UpTheCux

0

Dưới đây là tập lệnh BASH mẫu có thể giúp bạn nhận được một số gợi ý cho nhu cầu của riêng bạn.

#!/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

Vui lòng lưu ý rằng giá trị của $ CPU_THRESHOLD của bạn phải phụ thuộc vào số lượng lõi (CPU) bạn có trên hệ thống của mình. Một lời giải thích chi tiết về chủ đề này có thể được tìm thấy tại http://blog.scoutapp.com/articles/2009/07/31/under Hiểu-load-a Average .

Bạn có thể gọi tập lệnh của mình từ bên trong / etc / inittab hoặc cronjob cho mỗi số phút bạn thích. Cũng xin lưu ý rằng tập lệnh ví dụ sẽ giết tiến trình cao nhất nếu $ CPU_LOAD lớn hơn $ CPU_THRESHOLD.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.