SSH hace que el bucle while se detenga

Pregunta:

Finalmente me las arreglé para resumir un problema con el que he estado luchando durante algunas semanas. Utilizo SSH con "claves autorizadas" para ejecutar comandos de forma remota. Todo está bien, excepto cuando lo hago en un ciclo while. El ciclo termina después de completar cualquier iteración con un comando ssh.

Durante mucho tiempo pensé que esto era una especie de rareza de ksh, pero ahora descubrí que bash de hecho se comporta de manera idéntica.

Un pequeño programa de muestra para reproducir el problema. Esto se extrae de una implementación más grande que toma instantáneas y las replica entre los nodos de un clúster.

#!/bin/bash

set -x

IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool

ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG    " > /tmp/actionlist

#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
   echo ${RMT_FILESYSTEM}@${MARKER}
   [ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
   echo Remote Command Return Code: $?
done

(Tenga en cuenta que hay un carácter TAB en la expresión de búsqueda grep según la definición del comportamiento de la opción "-H" de la lista zfs).

Mi muestra tiene algunos sistemas de archivos ZFS para la raíz donde todas las "zonas" tienen su sistema de archivos raíz en un conjunto de datos llamado similar a

POOL / zones / app1zone
PISCINA / zonas / grupo2 / app2zone

etc.

El ciclo anterior debería crear una instantánea para cada uno de los conjuntos de datos seleccionados, pero en cambio opera solo en el primero y luego sale.

Que el programa encuentre el número correcto de conjuntos de datos se puede confirmar fácilmente verificando el archivo "/ tmp / actionlist" después de que existe el script.

Si el comando ssh se reemplaza, por ejemplo, por un comando echo, entonces el ciclo itera a través de todas las líneas de entrada. O mi favorito: anteponga "echo" al comando infractor.

Si utilizo un bucle for en su lugar, también funciona, pero debido al tamaño potencial de la lista de conjuntos de datos, esto podría causar problemas con la longitud máxima de la línea de comando expandida.

¡Ahora estoy 99,999% seguro de que solo esos bucles con comandos ssh en ellos me dan problemas!

Tenga en cuenta que la iteración en la que se ejecuta el comando ssh se completa. Es como si los datos ingresados ​​al ciclo while se perdieran repentinamente … Si las primeras líneas de entrada no ejecutan un comando ssh, entonces el ciclo continúa hasta que realmente ejecuta el comando SSH.

En mi computadora portátil donde estoy probando esto, tengo dos máquinas virtuales Solaris 10 con solo alrededor de dos o tres conjuntos de datos de muestra, pero lo mismo está sucediendo en los grandes sistemas SPARC donde está destinado a funcionar, y hay muchos conjuntos de datos.

Respuesta:

SSH podría estar leyendo de la entrada estándar, consumiendo su lista de acciones. Intente redirigir la entrada estándar de ssh a / dev / null:

ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER} </dev/null

Como regla general, al ejecutar comandos que pueden interferir con la entrada estándar en un bucle de estilo de while read while, me gusta envolver todo el cuerpo del bucle entre llaves:

cat /tmp/uuoc | while read RMT_FILESYSTEM ISMOUNTED
do {
    echo ${RMT_FILESYSTEM}@${MARKER}
    [ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
    echo Remote Command Return Code: $?
} < /dev/null; done

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım