Quiero eliminar todos los procesos que coincidan con una cadena específica. Aquí está mi script, que funciona bastante bien:
echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill
Ahora quiero ejecutar este script desde otro usuario mediante `su -c:
echo password | su -c "echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill" userName;
Mi problema es que cuando grep verySpecificChain
coincide con varios procesos, solo se pasa el primer elemento a xargs kill
:
30598 ==> killed
bash: line 1: 30599: command not found ==> Not killed
bash: line 2: 30600: command not found ==> Not killed
bash: line 3: 30606: command not found ==> Not killed
Realmente me gustaría entender por qué con o sin su -c
el comando cambia el comportamiento.
Estoy ejecutando GNU bash, versión 4.2.53(1) (x86_64-redhat-linux-gnu) en Fedora 20.
Respuesta1
Justopkill -f verySpecificChain
Respuesta2
No puedo explicar qué falla exactamente en su ejemplo (Así que admito que es algún tipo de programación vudú de mi parte.), pero esta es una solución que (casi - ver más abajo*) funciona en mi bash (Debian):
- deshacerse del interior
echo
; - escapar
$2
.
Resultado:
echo password | su -c "ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print \$2 }' | xargs kill" userName;
*Escribí "casi funciona" porque Debian no me permite usar su
una tubería para repetir la contraseña. Debo ejecutarlo sin inicial echo
y escribir la contraseña de forma interactiva. Supongo que no es un problema en Fedora de OP.