
Tenho um processo que quero encerrar remotamente. tentei
ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"
mas isso retorna o erro
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
No entanto, se eu executar o comando entre aspas
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
no host remoto funciona bem. Estou faltando alguma coisa aqui?
Responder1
A $(..)
substituição do comando falharia à medida que $
é expandido pelo shell local, mesmoantesele é passado para stdin
o ssh
comando. Você precisa escapar ou usar strings aqui.
Além disso, o comando dentro do awk
que é impresso $2
é interpolado como um argumento de linha de comando. Então escapamos para adiar sua expansão até que o comando seja executado remotamente.
Com a fuga,
ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"
ou com aqui-doc
ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF
Observe também que isso grep .. | grep .. | awk
é supérfluo. Você pode fazer toda a operação awk
sozinho. Ou melhor ainda, use pkill
para fazer com que o processo seja eliminado diretamente pelo nome.
Responder2
Isso funcionou para mim matar um conjunto de hosts:
for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done
Responder3
você pode opcionalmente fazer algo como
ssh remotehost "killall -r 'foo.*bar'"