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 $pidprima, 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
killallfa 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 viuccide 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 vicon un ultimo argomento che termina con .conf, usare pkill -fx 'vi.*\.conf'.
Per vedere l'elenco dei PID a cui pkillinviare 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 psnon è 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 -kper inviare loro un segnale. Ad esempio, fuser -k /usr/bin/finduccide 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 -1234o di kill -HUP -1234o di qualsiasi altro segnale.
Se non riesci a trovare un modo migliore, utilizzare pscon le opzioni appropriate per elencare tutti i processi e filtrarlo con grepo 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 grepo awkcomando stesso può essere elencato nella psproduzione ( pse 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 psnell'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 killsenza 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 -efin pkillo 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
pkilldalprocpspacchetto.