Linux: processo de eliminação baseado em argumentos

50

Como posso matar um processo com base em seus argumentos de linha de comando? killall , pgrep e pkill parecem funcionar apenas com base no nome do processo.

Eu preciso disso para diferenciar entre um número de aplicativos em execução dentro de 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.jar e depois matar manualmente o pid da saída, mas eu gostaria que um comando fizesse algo equivalente automaticamente.

    
por Mark Howard 07.02.2012 / 12:45

4 respostas

64

pgrep / pkill recebe um sinal -f . Na página man :

-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
    
por 07.02.2012 / 18:59
4

Você pode usar htop para visualizar todos os processos atualmente em execução com seus argumentos de linha de comando e para matar um processo selecionado.

    
por 07.02.2012 / 12:49
4

Substitua argument abaixo por uma expressão regular que tenha muito da linha de comando completa de um processo:

kill 'ps -eo pid,args --cols=10000 | awk '/argument/ && $1 != PROCINFO["pid"] { print $1 }''
    
por 07.02.2012 / 12:57
0

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

grep -a myapp.jar /proc/[1-9]*/cmdline|tr '
grep -a myapp.jar /proc/[1-9]*/cmdline|tr '%pre%' ' '|grep -v grep|awk -F/ '{print $3}'
' ' '|grep -v grep|awk -F/ '{print $3}'
    
por 22.06.2015 / 16:58

Tags