X süresinden sonra yüksek CPU kullanımıyla işlemi sonlandır [kapalı]


21

Linux çalıştıran Ara sıra çökme eğiliminde olan birkaç işlemim var (oyun sunucuları), bu da% 100 işlemci kullanıyor.

İşlemler listesinin cpu kullanımını ismiyle kontrol etmek için bir program veya komut dosyası arıyorum ve eğer X süresinden daha fazla% 100 ise 30 saniye, öldür onları. Ps-watcher'ı denedim ama bunun nasıl gerçekleştirileceğini belirleyemedim.

Süreci% 100 kullanımda öldürmek, normal çalışma sırasında kısa süreler için vuracağından işe yaramaz.

İstediğim şeyi yapmış gibi görünen bu betiği de buldum, ancak bir süreçle sınırlı: link

Herhangi bir yardım büyük beğeni topluyor!


Lütfen tekrar betiğe bir link gönderebilir misiniz? Bu bir pastebin.com/m1c814cb4 artık geçerli değil gibi görünüyor.

Minecraft sunucuları kullandığınızı tahmin etmek doğru olur muydum? ;)
PhonicUK 29:12

@Chris S Sen donuksun. Bu çok ilginç bir soru. Talepleriniz için bir kaynak sağlayabilir misiniz? "Çünkü düşük kalitedeki, düşünceli ve spam cevapları çekerler ve cevaplar hızla eski hale gelir." Ve bu soruya verilen mevcut cevapların buna nasıl cevap verdiğine dair örnekler verebilir misiniz? Nefesimi tutmuyorum.
db

Yanıtlar:


19

Monit'i dene .

Görevinizi gerçekleştirmek için böyle bir yapılandırma kullanabilirsiniz:

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

Bu konfigürasyonla ilgili detaylar monit'in belgelerinde bulunabilir .


Cevabınız için teşekkürler! Monit ile başlatmak zorunda kalmadan süreci izlemenin bir yolu var mı? Makinede çalışan ve web arayüzü aracılığıyla yönetilen, monit ile başlatmak zorunda kalmayan bir sunucuya sahibim.
user30153,

Elbette, start programve stop programsatırları monitişleminizi yeniden başlatmanız gerektiğinde sadece durum için. Yine de normal init betiğinizle başlayabilirsiniz. monitProgramın zaten çalışıp çalışmadığını da kontrol edebilir (örn. PID dosyası veya işlem adı ile).
joschi

Harika, sanırım anladım. Tek sorun bunun bir pid dosyasına bağımlı olması, 200'den fazla işlem için bir tane oluşturmak zorunda kalacağım ve sanırım her biri için kurallar oluşturmak zorunda kalacağım. Yardım için teşekkürler!
user30153

4

Aradığım şey buydu ve bir süredir kullanıyordum (biraz değişmiş). Son zamanlarda işime bir hata koydum ancak uygulamanın (oyun sunucusu) çalışmasına devam etmem gerekiyor.
Yanlış PID'yi öldürdüğü için en üstteki PID'in öldürüldüğü kısmı alıntı ettim.
İşte senaryonuzun son taslağı, şimdiye kadar, en üstteki aşırı yükü buluyor ve etkili bir şekilde öldürüyor (ayrıca, ne zaman bir şey olursa bana bilgi veriyor);

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


Bu küçük senaryo son derece kullanışlıdır, herhangi bir işlemi öldürmekten hoşlanmıyorsanız, yalnızca e-posta sizi bilgilendirmeye yardımcı olacaktır.


Cevabınız için teşekkürler! Sıralamanızın TOPPROCESSkapalı olduğunu belirtmek isterim . Gerçek değere göre sıralamaz, bunun yerine girdileri alfanümerik olarak sıralar (örneğin% 6,% 12'nin üzerinde olacaktır). Daha iyi bir alternatif şu komut olabilir:top -b -n 1 | sed 1,6d | sed -n 2p
Glutanimate

1
CPU% 90 ise CPU_LOAD nedir? ve eşiği nasıl hesaplarsınız? teşekkürler
Ofir Attia

1
Bu işlem, bir işlemin çok çekirdekli bir sunucuda gerçekleştirildiği durumları yakalamaz.
UpTheCreek

0

Aşağıda kendi ihtiyaçlarınız için bazı ipuçları almanıza yardımcı olabilecek örnek bir BASH betiği verilmiştir.

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

Lütfen $ CPU_THRESHOLD değerinin sisteminizde sahip olduğunuz (CPU) çekirdek sayısına bağlı olduğunu unutmayın. Bu konuyla ilgili ayrıntılı bir açıklama, http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages adresinde bulunabilir .

Komut dosyanızı / etc / inittab içinden veya tercih ettiğiniz her dakika için bir cronjob olarak çağırabilirsiniz. Lütfen $ CPU_LOAD $ CPU_THRESHOLD değerinden büyükse, örnek komut dosyasının en üstteki işlemi öldüreceğini de unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.