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.

Ryaner
źródło
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
Ian Clelland
źródło
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

billyw
źródło
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.

EEAA
źródło
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 {} \;

źródło
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 
dogbane
źródło
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.

Phil Hollenback
źródło