Trampa de limpieza para el comando ssh en múltiples hosts remotos

Trampa de limpieza para el comando ssh en múltiples hosts remotos

Quiero ejecutar un comando arbitrario en varios hosts remotos usando ssh. Estos comandos son en su mayoría comandos de larga duración que monitorean los recursos del servidor y agregan la salida a mi estación de trabajo local (como tail -f, mpstato tcpdump/ tcpflowcon grep, etc.).

El problema es que no he encontrado una manera de mantener el comando ejecutándose y luego finalizar de manera confiable tanto la conexión SSH como el comando remoto para todos los hosts.

Probé muchas sshvariaciones de banderas, esperar, gato, leer, trampas, etc. O ambas se eliminan instantáneamente, la terminal local se atasca o el comando remoto sigue ejecutándose en los hosts remotos después de que se cancela la conexión ssh.

Esto es lo que tengo en este momento.

function server_ssh() {
  pids=""
  for box in 01 02 03; do
    ssh -t -t -f server$box "$1" &
    pids="$pids $!"
  done
  trap 'kill -9 $pids' SIGINT
  # wait, cat, read ??
}

Respuesta1

Parece algo parañu paralelo. Pruebe algo como esto:

function server_ssh() {
  parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}

--line-bufferLa opción es necesaria para permitir mezclar la salida de los diferentes comandos (de forma predeterminada, agrupa la salida de cada comando, por lo que debe esperar hasta que cada uno termine de mostrarse).

-udebería funcionar aquí también. Normalmente, podría permitir que partes de líneas se mezclen, pero como los comandos que estás usando probablemente estén basados ​​en líneas, eso no debería suceder.

Editar: --line-bufferestá en prueba alfa en la versión que tengo (20130922-1), elegiría -u.

información relacionada