Matar proceso remoto a través de ssh

Matar proceso remoto a través de ssh

Tengo un proceso que quiero matar de forma remota. Lo intenté

ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"

pero esto devuelve el error

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

Sin embargo, si ejecuto el comando entre comillas

kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')

en el host remoto funciona bien. ¿Me estoy perdiendo de algo?

Respuesta1

La $(..)sustitución del comando fallaría ya que $el shell local lo expande inclusoantesse pasa al stdincomando ssh. Debes escapar de él o usar cadenas aquí.

Además, el comando dentro de awkque se imprime $2se interpola como un argumento de línea de comando. Entonces lo escapamos para diferir su expansión hasta que el comando se ejecute de forma remota.

Con escapar,

ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"

o con aquí-doc

ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF

También tenga en cuenta que grep .. | grep .. | awkes superfluo. Puedes hacer toda la operación awksolo. O incluso mejor, utilícelo pkillpara que el proceso finalice directamente por su nombre.

Respuesta2

Esto me funcionó para matar un 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  

Respuesta3

opcionalmente puedes hacer algo como

ssh remotehost "killall -r 'foo.*bar'"

información relacionada