Znajdź (i zabij) stare procesy


10

Zasadniczo muszę być w stanie przeskanować drzewo procesów i znaleźć procesy, które pasują do określonej nazwy, i zacząłem uruchamiać ponad tydzień z rzędu. Kiedy je mam, muszę je zabić. Wszystkie procesy są nadal postrzegane przez system jako uruchomione, po prostu nie wykorzystując czasu systemowego. Zwykle też będą siedzieć wiecznie w tym stanie.

Idealnie chciałbym znaleźć coś podobnego do znalezienia, ale dla procesów.

System jest Linuksem Debiana, który będzie skryptowany i uruchamiany przez crona, więc nie mam prawdziwych problemów z czymś dużym, ale zrozumiałym.


4
Jak zamierzasz rozróżniać stare, ale ważne procesy od tych, które z przyjemnością zabijesz?
— Chopper3

Odpowiedzi:


9

Możesz to zrobić za pomocą kombinacji ps, awk i kill:

ps -eo pid,etime,comm

Daje wynik z trzema kolumnami, z PID procesu, czasem, który upłynął od rozpoczęcia procesu, oraz nazwą polecenia bez argumentów. Upływający czas wygląda następująco:

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

Ponieważ chcesz, aby procesy działały dłużej niż tydzień, poszukaj linii pasujących do tego trzeciego wzorca. Możesz użyć awk do odfiltrowania procesów według czasu działania i nazwy polecenia, jak poniżej:

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

które wypisuje pid dla wszystkich poleceń pasujących do „mycommand”, które działały przez ponad 7 dni. Włącz tę listę w tryb „zabij” i gotowe:

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

Niezłe dzięki. Całkowicie zapomniałem o opcjach formatowania w ps.
— Ryaner

2
Nie pokazuje to, że procesy działają „dłużej niż 7 dni”. Pokazuje procesy trwające od 7 dni do mniej niż 8 dni.
— hobodave

etimesjest bardziej przydatny - serverfault.com/a/393476/67675
— poige

4

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


1
Działa to niesamowicie na Ubuntu 16.04 i możesz użyć flagi -i (interaktywnej) do testowania i upewnienia się, że celuje w procesy, które Twoim zdaniem powinny być.
— ezwrighter

1

Wszystkie potrzebne informacje można pobrać ps -ef. Zobacz kolumnę „STIME”. Połącz to z, grepaby uporządkować potrzebne procesy. W tym momencie możesz użyć, cutaby pobrać pid wszystkich pasujących procesów i przekazać je do kill.

Daj mi znać, jeśli chcesz uzyskać więcej informacji na ten temat.


Chciałbym więcej szczegółów. Pozostałe odpowiedzi są po prostu niepoprawne.
— hobodave

1

jeśli jesteś rootem, aby pozbyć się śmieci (/ proc / fs proc / stat ...)

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

0

Kiedy proces się uruchamia, tworzy katalog w systemie plików / proc. Możesz użyć polecenia find, aby uzyskać katalogi starsze niż 7 dni i zabić procesy w następujący sposób:

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

To też nie działa. Tak jak jest, generuje to ostrzeżenie i nie ma żadnych dodatkowych danych wyjściowych: 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.Przeniesienie -maxdepth, aby było pierwszym wyjściem, nie zwraca żadnych procesów, i jestem pewien, że wielu powinno pasować.
— hobodave

także dlaczego mtime nie ctime, jeśli szukasz daty utworzenia reż? katalog mógłby teoretycznie zostać zmodyfikowany, gdyby stworzono dodatkowe dziecko, czego nie wykluczyłbym (być może nowo załadowany moduł jądra w jakiś sposób rozszerzyłby sysfs)
— jmtd

0

Nikt nie wspominał tutaj o ps-watcherze . Myślę, że możesz porównać $ start_time za pomocą funkcji elapsed2sec, ale nie jestem do końca pewien. Oto moja pierwsza myśl:

[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

nie mam pojęcia, czy to działa, ale powinien być dobrym punktem wyjścia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.