
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 stdin
comando ssh
. Debes escapar de él o usar cadenas aquí.
Además, el comando dentro de awk
que se imprime $2
se 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 .. | awk
es superfluo. Puedes hacer toda la operación awk
solo. O incluso mejor, utilícelo pkill
para 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'"