Voglio uccidere tutti i processi che ottengo:
ps aux | grep my_pattern
Come farlo?
Questo non funziona:
pkill my_pattern
Voglio uccidere tutti i processi che ottengo:
ps aux | grep my_pattern
Come farlo?
Questo non funziona:
pkill my_pattern
Risposte:
Usa pkill -f
, che corrisponde al modello per qualsiasi parte della riga di comando
pkill -f my_pattern
pkill
- l'errore più comune è l'assunto che potrebbe esistere solo un'istanza di ciascun binario in un dato momento.
killall -m my_pattern
.
pgrep
prima per verificare cosa stai per uccidere. È possibile utilizzare pgrep -l
per visualizzare i nomi dei processi o pgrep -a
per visualizzare le righe di comando complete. Utilizza gli stessi flag di pkill. Quindi in questo caso potresti usare pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Cosa sta facendo questo codice?
Questo ps -ef
produce 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 grep
detti 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.
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 kill
parte con un flag trasmesso che richiede un arresto regolare e solo se tale richiesta viene rifiutata, usakill -9
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 -ef
elenca 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.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
xargs per non eseguire il comando se non viene fornito alcun argomento.
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.
-r
l'opzione non esiste su OS X, quindi sembra.
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.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(nota anche il refactoring; vedi anche il mio commento sulla risposta di @ synthesizerpatel).
ps
restituisce tre processi 123, 234 e 345, puoi kill 123 234 345
proprio come puoi rm
o cat
più argomenti di file.
grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
rimuoverà il grep
è 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 }')
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
-r
o --regexp
, che sono rispettivamente l'opzione corta e GNU lunga.
È 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.
Suona male?
pkill `pidof myprocess`
esempio:
# kill all java processes
pkill `pidof java`
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.
è meglio e più sicuro da usare pgrep -f
con kill
, o semplicemente pkill -f
, grep
l' ps
output di ing può andare storto.
A differenza dell'uso ps | grep
con cui è necessario filtrare la linea grep aggiungendo | grep -v
o usando trucchi con motivi, pgrep
semplicemente non si sceglierà dal punto di vista del design.
Inoltre, se il tuo modello appare in ps
's UID
/ USER
, SDATE
/ START
o 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$"
Ho preso la risposta di Eugen Rieck e ci ho lavorato. Il mio codice aggiunge quanto segue:
ps ax
include grep, quindi l'ho escluso con grep -Eiv 'grep'
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
my_pattern
semplicemente una sottostringa del nome o contiene caratteri speciali regex?