Supponiamo di avere un migliaio o più di istanze di qualsiasi processo (ad esempio, vi
) in esecuzione. Come posso ucciderli tutti in un colpo singolo / comando a una riga / comando singolo?
Supponiamo di avere un migliaio o più di istanze di qualsiasi processo (ad esempio, vi
) in esecuzione. Come posso ucciderli tutti in un colpo singolo / comando a una riga / comando singolo?
Risposte:
Cosa c'è che non va nel buon vecchio,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Ci sono modi per renderlo più efficiente,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
e altre varianti, ma a livello base, ha sempre funzionato per me.
echo kill -9 $pid
prima, quindi so cosa sto ricevendo. Non sono sicuro che AIX abbia pkill
, che è il mio pane e burro UNIX. Ed è davvero abbastanza brutto da essere votato in basso - strano.
csh
Usa killall,
killall vi
Questo ucciderà tutti i comandi chiamati 'vi'
Potresti anche aggiungere un segnale, ad esempio SIGKILL
killall -9 vi
killall -9 vi
killall
fa esattamente ciò che suggerisce il nome ... uccide il processo di init.
pkill
è ciò che raccomando, se disponibile ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). È possibile specificare i processi in base al nome del comando, alla riga di comando completa o ad altri criteri. Ad esempio, pkill vi
uccide tutti i programmi il cui nome comando contiene la sottostringa vi
. Per uccidere solo i processi chiamati vi
, utilizzare pkill -x vi
. Per uccidere solo i processi chiamati vi
con un ultimo argomento che termina con .conf
, usare pkill -fx 'vi.*\.conf'
.
Per vedere l'elenco dei PID a cui pkill
inviare un segnale, utilizzare pgrep
, che ha esattamente la stessa sintassi tranne per il fatto che non accetta un nome o un numero di segnale. Per visualizzare ulteriori informazioni su questi processi, eseguire
ps -p "$(pgrep …)"
Sotto Linux, ps -p $(pgrep -d, …)
invece , è necessario (questo è un bug: Linux ps
non è conforme a POSIX).
Un altro modo comune per identificare i processi da uccidere sono i processi che hanno un certo file aperto (che può essere l'eseguibile del processo). Puoi elencarli con fuser
; usare fuser -k
per inviare loro un segnale. Ad esempio, fuser -k /usr/bin/find
uccide tutte le istanze in esecuzione di find
.
Se c'è un processo in fuga che continua a biforcarsi, potrebbe essere necessario uccidere l'intero gruppo di processi contemporaneamente. Un gruppo di processi è identificato dal negativo del suo leader, che è il processo antenato di tutti i processi nel gruppo. Per vedere il gruppo di processi a cui appartiene un processo, esegui ps -o pgid
(oltre a qualsiasi opzione per selezionare i processi da visualizzare). Se si determina che si vuole uccidere il leader del gruppo di processo 1234 e tutti i suoi figli, correre kill -1234
o di kill -HUP -1234
o di qualsiasi altro segnale.
Se non riesci a trovare un modo migliore, utilizzare ps
con le opzioni appropriate per elencare tutti i processi e filtrarlo con grep
o con altri comandi di filtraggio del testo. Fare attenzione a non abbinare accidentalmente altri processi che eseguono un comando con un nome simile o con un argomento che contiene quel nome. Per esempio:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Ricordiamo che il grep
o awk
comando stesso può essere elencato nella ps
produzione ( ps
e il comando di filtraggio vengono avviati in parallelo, in modo che verrà visualizzato o non dipende temporizzazione). Ciò è particolarmente importante se gli argomenti del comando sono inclusi ps
nell'output.
pkill
è molto bello qui. Puoi dargli molti parametri per affinare il modello.
pkill
è disponibile su Linux, BSD e Solaris - afaik. Quindi ha una diffusione maggiore di killall
.
Il modo più semplice per fare è prima verificare che si ottengano gli ID processo corretti con:
pgrep -f [part_of_a_command]
Se il risultato è come previsto. Vai con:
pkill -f [part_of_a_command]
pgrep -f "command name"
Interessante nessuno ha menzionato questo. pidof genera pid di processi separati da spazi corrispondenti al nome del processo passato. Come tale, è possibile utilizzare direttamente il suo output con kill
senza tubazioni. Su Arch Linux che uso
kill -9 $(pidof <proc name>)
L'aspetto negativo di questa soluzione è che non consente l'uso di espressioni regolari.
Ti suggerirei di provare pkill
.
Ex: ps -ef | pkill -f command
Per mostrare l'elenco di tutti i processi da uccidere, provare innanzitutto a pgrep
:
Ex: ps -ef | pgrep -f command
ps -ef
in pkill
o pgrep
? Questi comandi non vengono letti dall'input standard.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
dalprocps
pacchetto.