GNU/Linux >> Linux Esercitazione >  >> Linux

Come uccidere tutti i processi con un determinato nome parziale?

Se hai bisogno di maggiore flessibilità nella selezione dei processi usa

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Puoi usare grep -e ecc.


Chiudi tutti i processi che corrispondono alla stringa "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Fonte:http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Perché "ps pipe kill" dal terminale è malvagio:

Il Piping di numeri interi che hai raschiato da ps -ef a kill -9 è cattivo e dovresti sentirti male, doppiamente se sei root o un utente con privilegi elevati, perché non dà al tuo processo la possibilità di chiudere in modo pulito le connessioni socket, ripulire i file temporanei, informare i suoi figli che non sta andando via o ripristina le sue caratteristiche terminali.

Invia invece 15, e attendi un secondo o due, e se non funziona, invia 2, e se non funziona, invia 1. Se non funziona, RIMUOVERE IL BINARIO perché il programma si comporta male.

Come principio generale non usiamo Unix Railgun per tagliare le siepi. https://porkmail.org/era/unix/award.html#kill

Spiegazione del comando precedente:

ps -ef produce un elenco di ID di processo sul computer visibile a questo utente. Il pipe grep lo filtra per le righe che contengono quella stringa. Il grep -v grep dice che non corrispondono al processo stesso che esegue il grepping. La pipa awk print dice di dividere le righe sullo spazio bianco delimitatore predefinito e filtrare sulla seconda colonna che è il nostro ID processo. La pipe xargs avvia un nuovo processo per inviare tutti quei pid a kill -9 , ponendo fine a tutti.

Perché ps pipe kill è cattivo, pericoloso, brutto e hacker:

  1. C'è una piccola possibilità che tu chiuda accidentalmente il sistema operativo o causi un comportamento indefinito in un processo non correlato, portando all'instabilità dell'intero sistema perché ps -ef elenca migliaia di processi e non puoi essere sicuro che alcuni processi di terze parti condividano il nome del tuo processo o che nel tempo tra la lettura e l'esecuzione di kill -9, il processid sia cambiato in qualcos'altro e ora hai terminato alcuni processi casuali processo necessario non correlato al tuo.

  2. Se il codice che viene terminato forzatamente sta eseguendo operazioni di database o transazioni sicure con condizioni di corsa a bassa probabilità, una frazione di una percentuale del tempo, l'atomicità di quella transazione verrà distrutta, producendo un comportamento indefinito. kill -9 non fa prigionieri. Se il tuo codice è sensibile a questo, prova a sostituire xargs kill parte con un flag trasmesso che richiede uno spegnimento regolare, e solo se tale richiesta viene rifiutata, l'ultima risorsa è kill -9

Ma, se comprendi tutti i rischi e li controlli con nomi univoci e sei d'accordo con alcune transazioni perse o corruzione occasionale, allora il 99,9% delle volte starai bene. Se c'è un problema, riavvia il computer, assicurati che non ci siano conflitti di processo. È a causa di un codice come questo che rende lo script del supporto tecnico:"Hai provato a riavviare il computer" un meme di livello 5. "Un Rogue Robot ha raschiato ps per trovare numeri interi e inviarli a kill -9 , quindi riavvia il computer per risolvere il problema.

Perché non usare solo pkill quale è più facile?

Quanto sopra mi dà il controllo manuale perché ps , grep , awk , kill e xargs sono standard multipiattaforma. Dà il pieno controllo a quale motore regex utilizzare, a quale parte del nome del processo corrispondere, gestendo la distinzione tra maiuscole e minuscole e la gestione delle eccezioni.

pkill -f -e -c myProcessName

Fa la stessa cosa per me, ma vedi man pkill ha comportamenti, flag e motori regex diversi tra le varianti di Linux, Mac, Zune-Bash e il mio router opensource. Quindi sì, metti il ​​tuo Unix-Railgun da 35000 Watt nelle abili mani di pkill per tagliare le siepi. Guarda cosa succede.


Usa pkill -f , che corrisponde al modello per qualsiasi parte della riga di comando

pkill -f my_pattern

Nel caso in cui non funzioni, prova a usare anche questo:

pkill -9 -f my_pattern

Linux
  1. Come trovare tutti i processi figlio?

  2. Come uccidere un processo figlio dopo un determinato timeout in Bash?

  3. Come uccidere tutti i processi in background in zsh?

  4. Come terminare tutti i processi restituiti da pgrep

  5. Come utilizzare Ctrl+C per terminare tutti i processi in background avviati in uno script Bash?

Come uccidere un processo in Linux

Come uccidere i processi Zombie in Linux

Come individuare e terminare un processo con il terminale Linux

Come uccidere i processi zombie in Ubuntu 20.04 LTS

Come uccidere i processi zombi in Ubuntu

Come uccidere i processi in Linux usando kill, killall e pkill