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 kill
me quejaré, pero funciona (al menos para mí):
sudo kill `ps -ae | grep foo` &>/dev/null
La &>/dev/null
parte es opcional; inclúyelo si no quieres ver todas las kill
quejas de.
Sé que probablemente haya una mejor manera de hacer esto, pero esta es la que yo uso.
Respuesta2
Como ya mencioné pgrep
y pkill
son tus amigos:
sudo pkill `pgrep -u root foo`
Si por alguna razón no tienes pgrep
y 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}')