Quero eliminar todos os processos que correspondam a uma cadeia específica. Aqui está o meu script, que funciona muito bem:
echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill
Agora quero executar este script de outro usuário via `su -c:
echo password | su -c "echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill" userName;
Meu problema é que quando grep verySpecificChain
corresponde a vários processos, apenas o primeiro elemento é passado para 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
Eu realmente gostaria de entender por que com ou sem su -c
o comando o comportamento muda?
Estou executando o GNU bash, versão 4.2.53(1)-release (x86_64-redhat-linux-gnu) no Fedora 20.
Responder1
Apenaspkill -f verySpecificChain
Responder2
Não consigo explicar o que exatamente falha no seu exemplo (então eu admito que é algum tipo de programação vodu da minha parte), mas esta é uma correção que (quase -- veja abaixo*) funciona no meu bash (Debian):
- livrar-se de dentro
echo
; - escapar
$2
.
Resultado:
echo password | su -c "ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print \$2 }' | xargs kill" userName;
*Eu escrevi "quase funciona" porque o Debian não me deixa usar su
um pipe para repetir a senha. Devo executá-lo sem inicial echo
e digitar a senha de forma interativa. Acho que não é um problema no Fedora do OP.