Come uccidere tutti i processi con un determinato nome parziale? [chiuso]


623

Voglio uccidere tutti i processi che ottengo:

ps aux | grep my_pattern

Come farlo?

Questo non funziona:

pkill my_pattern

11
È my_patternsemplicemente una sottostringa del nome o contiene caratteri speciali regex?
Sven Marnach,

Risposte:


1318

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

pkill -f my_pattern

7
@Jayan: è anche abbastanza indiscriminato nella sua uccisione. È sorprendentemente facile da gestire male ...
thkala

1
@Jayan: non mi convincerai :-). Sono stato bruciato troppe volte da script di terze parti che hanno insistito sull'uso pkill- l'errore più comune è l'assunto che potrebbe esistere solo un'istanza di ciascun binario in un dato momento.
thkala,

4
Per tutti gli utenti Mac che trovano questa risposta, come ho fatto io, l'equivalente per Mac è killall -m my_pattern.
Zev Eisenberg,

1
Se hai una serie di processi sospesi che non vengono uccisi, usa pkill -f -9 per ucciderli senza pietà
MacK

18
Ti consiglio di usare pgrepprima per verificare cosa stai per uccidere. È possibile utilizzare pgrep -lper visualizzare i nomi dei processi o pgrep -aper visualizzare le righe di comando complete. Utilizza gli stessi flag di pkill. Quindi in questo caso potresti usare pgrep -fa my_pattern.
Studgeek,

158

Uccidi 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

Cosa sta facendo questo codice?

Questo ps -efproduce un elenco di ID di processo sul computer visibile a questo utente. Il grep pipe lo filtra per le righe che contengono quella stringa. I grep -v grepdetti non corrispondono sul processo stesso facendo il grepping. La stampa awk pipe dice di dividere le righe nello spazio bianco del delimitatore predefinito e filtrare nella seconda colonna che è il nostro ID di processo. Il pipe xargs avvia un nuovo processo a cui inviare tutti quei pid kill -9, terminandoli tutti.

Il codice sopra è cattivo, pericoloso, brutto e hacker per diversi motivi.

  1. Se il codice che termina forzatamente sta eseguendo operazioni sul database o transazioni sicure con condizioni di gara a bassa probabilità, una frazione del percento delle volte, l'atomicità di quella transazione verrà distrutta, producendo un comportamento indefinito. uccidere -9 non prende prigionieri. Se il tuo codice è sensibile a questo, prova a sostituire la xargs killparte con un flag trasmesso che richiede un arresto regolare e solo se tale richiesta viene rifiutata, usakill -9

  2. C'è una possibilità non zero che tu possa finire accidentalmente il sistema operativo o causare comportamenti indefiniti in un processo non correlato, portando all'instabilità dell'intero sistema perché ps -efelenca tutti i possibili processi che potrebbero esistere e non puoi essere sicuro che qualche strana libreria di terze parti condivida il tuo nome del processo, o che nel tempo tra read ed esegui kill -9, il processid era cambiato in qualcos'altro, e ora hai accidentalmente terminato un processo casuale che non avevi intenzione di fare.

Ma, se capisci i rischi e li controlli con nomi molto univoci e stai bene con alcune transazioni perse o corruzione occasionale nei dati, allora il 99,9% delle volte andrà bene. In caso di problemi, riavviare il computer, assicurarsi che non vi siano collisioni tra processi. È a causa di questo codice che rende lo script di supporto tecnico: "Hai provato a riavviare il computer" un meme di livello 5.


15
Questo genererà un errore se non viene trovato alcun processo corrispondente al nome. Si consiglia di utilizzare ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9xargs per non eseguire il comando se non viene fornito alcun argomento.
Epigene,

2
Solo una leggera modifica, forse è meglio citare il nome del processo: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 senza virgolette, solo uno dei miei processi in background è stato ucciso al primo avvio. Eseguire di nuovo ha ucciso il resto.
Ali Haider,

-rl'opzione non esiste su OS X, quindi sembra.
Danijel,

52

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.


4
-1 Non hai bisogno di un loop, puoi solo kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(nota anche il refactoring; vedi anche il mio commento sulla risposta di @ synthesizerpatel).
Tripleee

11
@tripleee Nessun problema con il tuo downvote, ma si fa realizzare, che il OQ è stato "Voglio uccidere tutti i processi che ricevo da: ps aux | grep my_pattern" , che ho accettato dutyfully.
Eugen Rieck,

Kill ucciderà tutti i processi in una volta sola, non è necessario un loop per quello. Se psrestituisce tre processi 123, 234 e 345, puoi kill 123 234 345proprio come puoi rmo catpiù argomenti di file.
Tripleee

@tripleee Mi sto rimuovendogrep
Eugen Rieck il

for KILLPID in ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; donerimuoverà il grep
Justin E

18

è possibile utilizzare il comando seguente per elencare il processo

ps aux | grep -c myProcessName 

se è necessario controllare il conteggio di tale processo, quindi eseguire

ps aux | grep -c myProcessName |grep -v grep 

dopo di che puoi terminare il processo usando

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

è possibile utilizzare il comando seguente per elencare il processo ps aux | grep -c myProcessName se è necessario controllare il conteggio di quel processo, eseguire ps aux | grep -c myProcessName | grep -v grep dopo di che puoi terminare il processo usando kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima

13

Inoltre puoi usare killall -r my_pattern. -rInterpretazione del modello del nome del processo come espressione regolare estesa.

killall -r my_pattern

8

Se giudichi pkill -f PATTERNun po 'troppo pericoloso, ho scritto a ezkill uno script bash che ti chiede di scegliere quali processi tra quelli che corrispondono al PATTERN che vuoi uccidere.


7

È possibile utilizzare il seguente comando per

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

4

Se non vuoi avere mal di testa nel trovare l'id di processo, usa regexp per terminare il processo per nome. Ad esempio, per uccidere Chrome il seguente codice farà il trucco.

killall -r --regexp chrome


1
Hai solo bisogno di -r o --regexp , che sono rispettivamente l'opzione corta e GNU lunga.
BigSmoke il

3

È possibile utilizzare il comando seguente per:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

o

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Per me funziona.


1
Benvenuto in StackOverflow. Utilizzare il rientro di 4 spazi o tab per le righe di codice in modo che siano formattate come blocchi di codice. Cordiali saluti
YakovL

2

Suona male?

 pkill `pidof myprocess`

esempio:

# kill all java processes
pkill `pidof java`

2

Ho trovato il modo migliore per farlo per un server che non supporta pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

Non è necessario eseguire il loop.


1

è meglio e più sicuro da usare pgrep -fcon kill, o semplicemente pkill -f, grepl' psoutput di ing può andare storto.

A differenza dell'uso ps | grepcon cui è necessario filtrare la linea grep aggiungendo | grep -vo usando trucchi con motivi, pgrepsemplicemente non si sceglierà dal punto di vista del design.

Inoltre, se il tuo modello appare in ps's UID/ USER, SDATE/ STARTo in qualsiasi altra colonna, otterrai processi indesiderati nell'output e li ucciderai, pgrep+pkill non soffre di questo difetto.

ho anche scoperto che killall -r/ -regexp non ha funzionato con la mia espressione regolare.

pkill -f "^python3 path/to/my_script$"

man pkill


0

Ho preso la risposta di Eugen Rieck e ci ho lavorato. Il mio codice aggiunge quanto segue:

  1. ps ax include grep, quindi l'ho escluso con grep -Eiv 'grep'
  2. Aggiunti alcuni if ​​ed echi per renderlo leggibile dall'uomo.

Ho creato un file, chiamato killserver, eccolo qui:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

risultati

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

Questo è il modo:

kill -9 $(pgrep -d' ' -f chrome)

3
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Igor F.
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.