Trova (e uccidi) vecchi processi


10

Fondamentalmente ho bisogno di essere in grado di scansionare l'albero dei processi e trovare i processi che corrispondono a un determinato nome e ho iniziato a correre più di una settimana alla volta. Una volta che li ho, devo ucciderli. Tutti i processi sono ancora visti come in uno stato in esecuzione dal sistema, semplicemente non utilizzando alcun tempo di sistema. Di solito siederanno per sempre anche in questo stato.

Idealmente vorrei qualcosa di simile da trovare, ma per i processi.

Il sistema è Debian Linux e questo sarà scriptato ed eseguito da cron, quindi non ho problemi reali con qualcosa di grande ma comprensibile.


4
come farai a distinguere tra processi vecchi ma importanti e quelli che sei felice di uccidere?
Chopper3,

Risposte:


9

Puoi farlo con una combinazione di ps, awk e kill:

ps -eo pid,etime,comm

Fornisce un output a tre colonne, con il PID del processo, il tempo trascorso dall'inizio del processo e il nome del comando, senza argomenti. Il tempo trascorso appare come uno di questi:

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

Poiché desideri processi in esecuzione da più di una settimana, dovresti cercare le linee che corrispondono a quel terzo modello. Puoi usare awk per filtrare i processi in base al tempo di esecuzione e al nome del comando, in questo modo:

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

che stamperà i pid di tutti i comandi corrispondenti a "mycommand" che sono in esecuzione da più di 7 giorni. Inoltra quell'elenco in kill e il gioco è fatto:

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

Bello grazie. Dimenticato completamente le opzioni di formattazione in ps.
Ryaner,

2
Questo non mostra i processi in esecuzione "più di 7 giorni". Mostra i processi in esecuzione tra 7 giorni ma meno di 8 giorni.
hobodave,

etimesè più utile - serverfault.com/a/393476/67675
poige

4

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


1
Funziona alla grande su Ubuntu 16.04 e puoi usarlo con il flag -i (interattivo) per testare e assicurarti che sia mirato ai processi che ritieni debbano essere.
ezwrighter,

1

Tutte le informazioni di cui hai bisogno possono essere prese da ps -ef. Vedi la colonna "STIME". Abbinalo a grepper risolvere i processi di cui hai bisogno. A quel punto, puoi usare cutper afferrare il pid di tutti i processi di abbinamento e passarli a kill.

Per favore fatemi sapere se volete maggiori dettagli su come farlo.


Vorrei maggiori dettagli. Le altre risposte sono semplicemente errate.
hobodave,

1

se sei root, per sbarazzarti della spazzatura (/ proc / fs proc / stat ...)

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

0

All'avvio di un processo, crea una directory nel filesystem / proc. È possibile utilizzare il comando find per ottenere directory più vecchie di 7 giorni e terminare i processi come segue:

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

Neanche questo funziona. Così com'è genera questo avvertimento e nessun output aggiuntivo: lo 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.spostamento di -maxdepth come primo output non restituisce alcun processo, e sono sicuro che molti dovrebbero corrispondere.
hobodave,

anche perché mtime non ctime se stai cercando la data di creazione della directory? la directory potrebbe teoricamente essere modificata se fosse creato un figlio aggiuntivo, che non escluderei (forse un modulo del kernel appena caricato estenderebbe in qualche modo il sysfs)
jmtd

0

Nessuno ha menzionato ps-watcher qui. Penso che potresti essere in grado di confrontare $ start_time usando la funzione elapsed2sec ma non ne sono del tutto sicuro. Ecco il mio primo pensiero:

[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

non ho idea se funzioni, ma dovrebbe essere un buon punto di partenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.