Matikan proses dengan penggunaan CPU yang tinggi setelah waktu X? [Tutup]


21

Menjalankan Linux Saya memiliki beberapa proses yang cenderung macet sesekali (server game), yang akhirnya menggunakan cpu 100%.

Saya sedang mencari program atau skrip untuk memeriksa penggunaan cpu dari daftar proses dengan nama dan jika mereka berada di 100% untuk lebih dari waktu X, katakan 30 detik, bunuh mereka. Saya mencoba ps-watcher tetapi tidak dapat menentukan bagaimana mencapai ini.

Hanya mematikan proses pada penggunaan 100% tidak akan berhasil karena akan mencapai itu untuk periode singkat selama operasi normal.

Saya juga menemukan skrip ini yang tampaknya melakukan apa yang saya inginkan, namun ini terbatas pada satu proses: tautan

Setiap bantuan sangat dihargai!


Bisakah Anda memposting lagi tautan ke skrip karena yang ini pastebin.com/m1c814cb4 tampaknya tidak berlaku lagi.

Apakah saya benar menebak bahwa Anda menjalankan server Minecraft? ;)
PhonicUK

@ Chris S Kamu membosankan. Ini pertanyaan yang sangat menarik. Dapatkah Anda memberikan sumber untuk klaim Anda "karena mereka menarik kualitas rendah, berpendapat dan jawaban spam, dan jawabannya menjadi usang dengan cepat."? Dan dapatkah Anda memberikan beberapa contoh bagaimana jawaban yang ada untuk pertanyaan ini sesuai dengan ini? Saya tidak menahan nafas.
db

Jawaban:


19

Coba monit .

Anda dapat menggunakan konfigurasi seperti ini, untuk menyelesaikan tugas Anda:

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

Rincian tentang konfigurasi ini dapat ditemukan dalam dokumentasi monit .


Terima kasih atas balasannya! Apakah ada cara untuk memantau proses tanpa harus memulainya dengan monit? Saya memiliki banyak server yang berjalan pada mesin yang dikelola melalui antarmuka web, harus meluncurkannya dengan monit tidak ideal.
user30153

Tentu, garis start programdan stop programhanya untuk kasus ketika monitperlu memulai kembali proses Anda. Anda masih dapat memulainya dengan skrip init normal Anda. monitjuga dapat memeriksa apakah program sudah berjalan (mis. dengan file PID atau nama prosesnya).
joschi

Fantastis, saya pikir saya sudah menemukannya. Satu-satunya masalah adalah ketergantungannya pada file pid, saya harus membuat satu untuk lebih dari 200 proses, dan membuat aturan untuk setiap yang saya kira. Terima kasih untuk bantuannya!
user30153

4

Ini adalah apa yang saya cari, dan telah menggunakannya untuk beberapa waktu sekarang (sedikit diubah). Akhir-akhir ini, saya telah memasukkan bug dalam pekerjaan saya tetapi harus tetap menjalankan aplikasi (server game).
Saya telah mengutip bagian di mana PID teratas dibunuh, karena membunuh PID yang salah.
Inilah draf skrip Anda yang terbaru, sejauh ini, ia menemukan kelebihan yang paling banyak dan secara efektif membunuhnya (juga mengirimi saya email info kapan pun ia melakukan sesuatu);

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


Skrip kecil ini sangat berguna, jika Anda tidak suka mematikan proses apa pun, email saja akan membantu Anda mendapatkan informasi.


Terima kasih atas jawaban anda! Saya hanya ingin menunjukkan bahwa penyortiran Anda TOPPROCESStidak aktif. Itu tidak akan mengurutkan berdasarkan nilai aktual, melainkan akan memesan entri secara alfanumerik (misalnya 6% akan didahulukan lebih dari 12%). Alternatif yang lebih baik mungkin adalah perintah berikut:top -b -n 1 | sed 1,6d | sed -n 2p
Glutanimate

1
Jika CPU 90%, apa itu CPU_LOAD? dan bagaimana Anda menghitung ambang? terima kasih
Ofir Attia

1
Ini tidak akan menangkap situasi di mana satu proses dimaksimalkan pada server multi-inti.
UpTheCreek

0

Di bawah ini adalah contoh skrip BASH yang dapat membantu Anda mendapatkan beberapa petunjuk untuk kebutuhan Anda sendiri.

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

Harap perhatikan bahwa nilai $ CPU_THRESHOLD Anda harus bergantung pada jumlah (CPU) core yang Anda miliki di sistem Anda. Penjelasan terperinci tentang topik ini dapat ditemukan di http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages .

Anda dapat memanggil skrip Anda dari dalam / etc / inittab atau cronjob untuk setiap menit yang Anda inginkan. Harap perhatikan juga bahwa skrip contoh akan mematikan proses paling atas jika $ CPU_LOAD lebih besar dari $ CPU_THRESHOLD.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.