Come uccidere più processi


21

per trovare il PID del processo per uccidere usare:

pgrep <process command>

Quindi uso il comando kill per uccidere il PID restituito da pgrep <process command>

kill <PID>

Questi comandi possono essere combinati in uno in modo da poter eliminare il PID o il PID restituito da pgrep <process command>? Oppure esiste un metodo per uccidere più processi in base al nome del comando?

Qualcosa di simile a : kill(pgrep <name of process>)


3
Ci hai provato pkill? In alternativa, potresti voler usare xargs.
Matthew Rock

1
Nota che le pagine man sono anche buone per cose come questa. Spesso non solo ti dicono come usare il comando, ma ti dicono anche dei comandi correlati. In questo caso, la pgreppagina man menziona pkillovunque (poiché i 2 comandi provengono dallo stesso pacchetto).
Patrick,

Risposte:


27

Puoi usare pkill:

pkill httpd

Potresti anche voler usare la sostituzione del processo (anche se questo non è così chiaro):

kill $(pgrep command)

E potresti voler usare xargs:

pgrep command | xargs kill

4
Ho fatto una cosa simile in una risposta e mi è stato fatto notare che ho introdotto una condizione di gara. Gli ID di processo possono essere invalidati tra le chiamate a pgrepe kill. Basta usare pkill.
Kusalananda

3
@Kusalananda può succedere la stessa cosa tra pkillottenere l'elenco dei processi e inviare effettivamente il segnale, in questo caso è più difficile da vedere.
Hobbs,

1
Stavo per provare a scrivere una risposta che includesse qualcosa come kill $(ps|head -1)evitare le condizioni di gara ... ma non c'è davvero modo di evitarlo. Il processo potrebbe morire in qualsiasi momento della pipeline.
Ross Presser,

Stai solo attento con pkill perché alcuni programmi potrebbero avere più di un'istanza in esecuzione e potresti non voler ucciderli tutti. Eseguire pgrep per primo aiuterà se non si avvia un altro tra il momento in cui si esegue pgrep e pkill (gara).
Joe,

1
Anche un programma C non può evitare le condizioni di gara, la finestra sarà solo più piccola. L'unico modo per farlo davvero atomicamente sarebbe aggiungere una chiamata di sistema che uccida i processi per nome. Ma gli ID di processo generalmente non verranno riutilizzati molto rapidamente, quindi il pericolo è praticamente inesistente.
Barmar,

17

Puoi anche usare killall, ad es

killall firefox

per inviare SIGTERMa tutti i firefoxprocessi.


8
Nota che killallha significati diversi su diversi sistemi unix - se sei su un sistema non Linux assicurati di controllare la documentazione.
Casuale 832,

killall -KILL firefoxpuò sentirti davvero gratificante.
pipe

La non portabilità di killallè il motivo per cui non lo uso mai. L'esecuzione killallsu una scatola di solaris, ad esempio, è disastrosa.
Patrick,


0

È possibile interrompere più processi con l'array. In questo caso è possibile specificare le opzioni come $ip, $hostnameo qualcosa di simile.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
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.