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 kill
vou reclamar, mas funciona (pelo menos para mim):
sudo kill `ps -ae | grep foo` &>/dev/null
A &>/dev/null
parte é opcional; inclua-o se não quiser ver todas as kill
reclamações de.
Eu sei que provavelmente existe uma maneira melhor de fazer isso, mas é isso que eu uso.
Responder2
Como já 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
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}')