Eski işlemleri bulma (ve öldürme)


10

Temel olarak süreç ağacını tarayabilmem ve belirli bir adla eşleşen ve bir haftadan fazla çalışmaya başlayan süreçleri bulabilmem gerekiyor. Onlara sahip olduğumda, onları öldürmem gerekiyor. Tüm süreçler hala sistem tarafından çalışır durumda olarak görülür, herhangi bir sistem zamanı kullanılmaz. Genellikle bu durumda sonsuza kadar oturacaklardır.

İdeal olarak, bulmaya benzer bir şey istiyorum, ancak süreçler için.

Sistem Debian linux ve bu senaryo ve cron tarafından çalıştırılacak, bu yüzden büyük ama anlaşılabilir bir şeyle ilgili gerçek bir sorunum yok.


4
eski ama önemli süreçleri ve öldürmekten mutlu olduğunuz süreçleri nasıl ayıracaksınız?
Chopper3

Yanıtlar:


9

Bunu ps, awk ve kill kombinasyonuyla yapabilirsiniz:

ps -eo pid,etime,comm

İşlem PID'si, işlemin başlamasından bu yana geçen süre ve komut adı olmadan bağımsız değişken olmadan üç sütun çıktısı verir. Geçen zaman bunlardan birine benziyor:

mm:ss
hh:mm:ss
d-hh:mm:ss

Bir haftadan uzun bir süredir devam eden süreçler olmasını istediğiniz için, bu üçüncü kalıpla eşleşen satırları ararsınız. İşlemleri çalışma zamanı ve komut adına göre filtrelemek için awk kullanabilirsiniz, örneğin:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

7 günden uzun süredir çalışan 'mycommand' ile eşleşen tüm komutların pids'lerini yazdıracaktır. Bu listeyi öldürmeye yönlendirin ve işiniz bitti:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9

Güzel bir teşekkürler. Tamamen ps biçimlendirme seçeneklerini unuttum.
Ryaner

2
Bu, "7 günden fazla" çalışan işlemleri göstermez. 7 gün arasında, ancak 8 günden az süren işlemleri gösterir.
hobodave

etimesdaha kullanışlıdır - serverfault.com/a/393476/67675
poige

4

killall --quiet --older-than 1w process_name


1
Bu Ubuntu 16.04'te harika çalışıyor ve olması gerektiğini düşündüğünüz süreçleri hedeflediğinden emin olmak için -i (etkileşimli) bayrağıyla birlikte kullanabilirsiniz.
ezwrighter,

1

İhtiyacınız olan tüm bilgiler alınabilir ps -ef. "STIME" sütununa bakın. grepİhtiyacınız olan işlemleri sıralamak için bunu birleştirin . Bu noktada, cuteşleşen tüm işlemlerin pid'ini kapmak ve bunları aktarmak için kullanabilirsiniz kill.

Bunun nasıl yapılacağı hakkında daha fazla bilgi almak isterseniz lütfen bize bildirin.


Daha fazla ayrıntı istiyorum. Diğer cevaplar yanlış.
hobodave

1

Kök iseniz, çöplerden kurtulmak için (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

Bir işlem başladığında, / proc dosya sisteminde bir dizin oluşturur. 7 günden eski dizinleri almak ve aşağıdaki gibi işlemleri öldürmek için find komutunu kullanabilirsiniz:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

Bu da işe yaramıyor. Olduğu gibi bu uyarı üretir ve ek çıkış yok: find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.-maxdepth hareketli hiçbir işlem döndürür ilk çıkış olarak, ve ben birçok maç gerekir olumlu.
hobodave

Ayrıca dir zaman oluşturma tarihini arıyorsanız neden mtime ctime değil? ek bir çocuk oluşturulduysa dir teorik olarak değiştirilebilir, ki ben bunu
dışlamam

0

Kimse burada ps-watcher'dan bahsetmedi . Bence ela2ed2sec işlevini kullanarak $ start_time karşılaştırmak mümkün olabilir ama tamamen emin değilim. İşte ilk düşüncem:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

bunun işe yarayıp yaramadığı hakkında bir fikrim yok ama iyi bir başlangıç ​​noktası olmalı.

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.