Linux: Processo de interrupção baseado em argumentos

55

Como posso matar um processo com base em seus argumentos de linha de comando? killall, pgrepE pkillparecem funcionar apenas com base no nome do processo.

Eu preciso que isso seja capaz de diferenciar entre vários aplicativos em execução dentro das máquinas virtuais Java, onde javaé o nome do processo para todos eles e o nome real do aplicativo pode ser encontrado observando os argumentos da linha de comando.

Isso pode ser feito manualmente com ps aux | grep myapp.jare, em seguida, eliminando manualmente o pid da saída, mas eu gostaria de um comando para fazer algo equivalente automaticamente.

Mark Howard
fonte

Respostas:

70

pgrep/ pkilllevo uma -fbandeira. Na manpágina:

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

Por exemplo:

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

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

$ pgrep sleep
8008
Michael Mrozek
fonte
+1, mas meu bash 4.1.5 não funciona para dois pontos depois de um e comercial (como na primeira linha do exemplo) ... bash: syntax error near unexpected token ';'... Funciona em uma declaração de caso quando o e comercial é seguido por ;;... talvez você estiver usando um shell diferente (?)
Peter.O
@ jw013 Eu estava realmente usando zsh, que suporta a sintaxe que eu usei. Deixando-a trabalhos em ambos, porém, assim eu o retirei
Michael Mrozek
@MichaelMrozek ok nvm then :) Gostaria de saber se o unix.SE tem uma proporção maior de zshusuários do que em qualquer outro lugar - eu apenas pareço encontrar zshusuários aqui.
Jw013
4

Você pode usar htoppara exibir todos os processos atualmente em execução com seus argumentos de linha de comando e eliminar um processo selecionado.

Jan Henke
fonte
4

Substitua argumentabaixo por uma expressão regular que deve muito a linha de comando completa de um processo:

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

Se você não tem pkill ou qualquer outra coisa, use proc / [1-9] * / cmdline

grep -a myapp.jar /proc/[1-9]*/cmdline|tr '\0' ' '|grep -v grep|awk -F/ '{print $3}'
ikrabbe
fonte