Mate o processo remoto via ssh

Mate o processo remoto via ssh

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 stdino sshcomando. Você precisa escapar ou usar strings aqui.

Além disso, o comando dentro do awkque é 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 awksozinho. Ou melhor ainda, use pkillpara 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'"

informação relacionada