sudo para eliminar la salida de ps, awk, xargs

sudo para eliminar la salida de ps, awk, xargs

Quiero eliminar procesos propiedad de root que contengan foo en el nombre del proceso

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

este comando falla porque awk y se ignoran los xargs.

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

Entonces Kill recibe malos argumentos.

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.

Respuesta1

Este es un truco feo y killme quejaré, pero funciona (al menos para mí):

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

La &>/dev/nullparte es opcional; inclúyelo si no quieres ver todas las killquejas de.

Sé que probablemente haya una mejor manera de hacer esto, pero esta es la que yo uso.

Respuesta2

Como ya mencioné pgrepy pkillson tus amigos:

sudo pkill `pgrep -u root foo`

Si por alguna razón no tienes pgrepy pkill, puedes hacer algo como esto:

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

Respuesta3

Creo que su verdadero problema radica en las citas. Entre comillas dobles, $2 se expande incluso antes de pasarlo a sh. Las comillas simples utilizadas en su código no aíslan esto porque son solo caracteres entre comillas. Pruebe uno de estos métodos de cotización:

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 }'"

Respuesta4

De esta manera puedes evitar problemas con las comillas dobles. El resultado debería ser el mismo.

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

información relacionada