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:
-
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. -
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