it-swarm-eu.dev

Come uccidere tutti i processi con un determinato nome parziale?

Voglio uccidere tutti i processi che ottengo:

ps aux | grep my_pattern

Come farlo?

Questo non funziona:

pkill my_pattern
500
Łukasz Lew

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

pkill -f my_pattern
1099
Dor Shemer

Elimina 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?

ps -ef produce un elenco di id di processo sul computer visibile a questo utente. Il pipe grep filtra in basso per le righe contenenti quella stringa. Il grep -v grep dice che non coincide con il processo stesso che esegue l'operazione. Il pipe awk print dice dividere le righe sugli spazi bianchi del delimitatore di default e filtrare sulla seconda colonna che è il nostro id di processo. Il pipe xargs fa girare una nuova procedura per inviare tutti quei pid a kill -9, chiudendoli tutti.

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

  1. Se il codice che viene forzato a forza sta facendo operazioni di database o transazioni sicure con condizioni di corsa a bassa probabilità, una frazione della percentuale del tempo, l'atomicità di quella transazione sarà distrutta, producendo un comportamento indefinito. kill -9 non prende prigionieri. Se il tuo codice è sensibile a questo, prova a sostituire la parte xargs kill con un flag trasmesso che richiede un arresto regolare, e solo se tale richiesta è negata, usa l'kill -9 ultimo

  2. C'è una possibilità diversa da zero per terminare accidentalmente il sistema operativo o causare un comportamento indefinito in un processo non correlato, portando all'intera instabilità del sistema perché ps -ef elenca tutti i possibili processi che potrebbero esistere e non si può essere sicuri di alcune strane condivisioni di librerie di terze parti il tuo nome di processo, o quello nel tempo tra read ed exec-9, il processid è cambiato in qualcos'altro, e ora hai casualmente terminato un processo casuale che non avevi intenzione di fare.

Ma, se comprendi i rischi e il controllo per loro con nomi univoci, e stai bene con alcune transazioni abbandonate o corruzione occasionale nei dati, allora il 99,9% delle volte starai bene. Se c'è un problema, riavvia il computer, assicurati che non ci siano conflitti tra processi. È a causa di un codice come questo che fa lo script del supporto tecnico: "Hai provato a riavviare il computer" un meme di livello 5.

114
Eric Leschinski

Se hai bisogno di più 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.

50
Eugen Rieck

è possibile utilizzare il seguente comando per elencare il processo

ps aux | grep -c myProcessName 

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

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

dopo di che puoi uccidere il processo usando

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

Inoltre puoi usare killall -r my_pattern.-r Interpreta il modello del nome del processo come un'espressione regolare estesa.

killall -r my_pattern
10
Alex

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

7
kraymer

È possibile utilizzare il seguente comando per

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

È possibile utilizzare il seguente comando 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.

2
Luis Lopes

Suona male?

 pkill `pidof myprocess`

esempio:

# kill all Java processes
pkill `pidof Java`
1
user6482587

Trovato il modo migliore di farlo per un server che non supporta ' pkill '

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

Non devi fare il ciclo.

0
Magige Daniel

è meglio e più sicuro usare pgrep -f con kill, o solo pkill -f, greping ps l'output può sbagliare.

A differenza dell'utilizzo di ps | grep con il quale è necessario filtrare la riga di grep aggiungendo | grep -v o utilizzando i trucchi del pattern, pgrep non si selezionerà per progettazione.

Inoltre, se il tuo pattern appare in psUID/USER, SDATE/START o in qualsiasi altra colonna, riceverai processi indesiderati nell'output e li ucciderai, pgrep + pkill non soffrirebbe 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
Wis