Linux: uccidi processo basato su argomenti


55

Come posso uccidere un processo basato sui suoi argomenti da riga di comando? killall, pgrepe pkillsembrano funzionare solo in base al nome del processo.

Ho bisogno di questo per essere in grado di distinguere tra un numero di applicazioni in esecuzione all'interno di macchine virtuali Java, dove javaè il nome del processo per tutti loro e il nome effettivo dell'applicazione può essere trovato guardando gli argomenti della riga di comando.

Questo può essere fatto manualmente con ps aux | grep myapp.jare poi uccidendo manualmente il pid dall'output, ma vorrei un comando per fare qualcosa di equivalente automaticamente.

Risposte:


70

pgrep/ pkillprendi una -fbandiera. Dalla manpagina:

-f    The pattern is normally only matched against the process name.
      When -f is set, the full command line is used.

Per esempio:

$ sleep 30& sleep 60&
[1] 8007
[2] 8008

$ pkill -f 'sleep 30'
[1]  - terminated  sleep 30

$ pgrep sleep
8008

+1, ma la mia bash 4.1.5 non funziona per i due punti dopo una e commerciale (come nella prima riga dell'esempio) ... bash: syntax error near unexpected token ';'... Funziona in un'istruzione case quando la e commerciale è seguita da ;;... forse stai usando una shell diversa (?)
Peter.O

@ jw013 In realtà stavo usando zsh, che supporta la sintassi che ho usato. Lasciarlo fuori funziona in entrambi però, quindi l'ho rimosso
Michael Mrozek

@MichaelMrozek ok nvm allora :) Mi chiedo se unix.SE ha una percentuale di zshutenti più elevata rispetto a qualsiasi altra parte - mi sembra di trovare solo zshutenti qui.
jw013,

4

È possibile utilizzare htopper visualizzare tutti i processi attualmente in esecuzione con i relativi argomenti della riga di comando e per terminare un processo selezionato.


4

Sostituisci di argumentseguito con un'espressione regolare che deve comprendere l'intera riga di comando di un processo:

kill `ps -eo pid,args --cols=10000 | awk '/argument/ && $1 != PROCINFO["pid"] { print $1 }'`

0

Se non hai pkill o altro, usa semplicemente proc / [1-9] * / cmdline

grep -a myapp.jar /proc/[1-9]*/cmdline|tr '\0' ' '|grep -v grep|awk -F/ '{print $3}'
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.