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

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

Quero eliminar processos de propriedade do root contendo foo no nome do processo

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

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

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

então kill recebe argumentos ruins

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.

Responder1

Este é um truque feio e killvou reclamar, mas funciona (pelo menos para mim):

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

A &>/dev/nullparte é opcional; inclua-o se não quiser ver todas as killreclamações de.

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

Responder2

Como já mencionado pgrepe pkillsão seus amigos:

sudo pkill `pgrep -u root foo`

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

for n in $(ps -u root | grep foo | cut -d ' ' -f 2); do sudo kill $n; done

Responder3

Acredito que seu verdadeiro problema está na citação. Entre aspas duplas, $2 é expandido antes mesmo de ser passado para sh. As aspas simples usadas em 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 \$2 }'"

Responder4

Dessa forma, você pode evitar problemas de aspas duplas. O resultado deve ser o mesmo.

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

informação relacionada