sudo para matar a saída de ps, awk, xargs

4

Eu quero matar os processos de propriedade da raiz contendo foo no nome do processo

sudo sh -c "ps aux | grep [f]oo  | awk '{print $2}' | xargs kill -15"

este comando falha quando awk e xargs são ignorados.

sudo sh -c "ps aux | grep [f]oo  | awk '{print $2}' | xargs kill -15"

então kill recebe bad args

kill pid ...              Send SIGTERM to every process listed.
  kill signal pid ...       Send a signal to every process listed.
  kill -s signal pid ...    Send a signal to every process listed.
  kill -l                   List all signal names.
  kill -L                   List all signal names in a nice table.
  kill -l signal            Convert between signal numbers and names.
    
por Dave 11.01.2013 / 22:57

4 respostas

1

Esse é um hack feio, e kill vai reclamar, mas funciona (pelo menos para mim):

sudo kill 'ps -ae | grep foo' &>/dev/null

A parte &>/dev/null é opcional; inclua-o se não quiser ver todas as reclamações de kill .

Eu sei que provavelmente existe uma maneira melhor de fazer isso, mas é isso que eu uso.

    
por 11.01.2013 / 23:06
1

Eu acredito que seu verdadeiro problema está na citação. Dentro de aspas duplas, $ 2 é expandido antes mesmo de ser passado para sh. As aspas simples usadas no seu código não isolam isso porque são apenas caracteres entre aspas. Experimente um destes métodos de cotação:

sh -c 'ps aux | grep [f]oo | awk '\''{ print $2 }'\'

sh -c $'ps aux | grep [f]oo | awk \'{ print $2 }\''

sh -c "ps aux | grep [f]ox | awk '{ print \ }'"

    
por 25.01.2013 / 09:16
0

Como já foi mencionado, pgrep e pkill são seus amigos:

sudo pkill 'pgrep -u root foo'

Se por algum motivo você não tiver pgrep e pkill , poderá fazer algo assim:

for n in $(ps -u root | grep foo | cut -d ' ' -f 2); do sudo kill $n; done
    
por 12.01.2013 / 18:32
0

Dessa forma, você pode evitar problemas de cotação dupla. O resultado deve ser o mesmo.

sudo kill -15 $(ps aux | grep '[f]oo' | awk '{print $2}')
    
por 23.10.2018 / 10:10