1 votos

Paralelismo de alquitrán remoto y obtención de salida por tubería ssh

He tratado de paralelizar el script que estoy usando, pero hasta el momento GNU Paralelo es muy difícil.

Tengo 2 archivos: uno que contiene los hosts en la que va a ejecutar el comando y el segundo tener parámetros para el comando. A continuación se muestra los datos:

$ cat workers.host 
foo@192.168.0.7
bar@192.168.0.8
jerry@192.168.0.9
tom@192.168.0.21



$ cat paths
/usr/local/jar/x/y/ jarxy
/usr/local/jar/z/y/ jarzy
/usr/local/jar/y/y/ jaryy
/usr/local/far/x/y/ farxy
/usr/local/jaz/z/z/ jazzz
/usr/local/mu/txt/ana/ acc01
/usr/local/jbr/x/y/ accxy

Y para el proceso que, yo uso la siguiente secuencia de comandos:

#!/bin/bash

echo "Run this on 192.168.130.10";

DATA=`date +%F`
DDAY=`date +%u`
DOMBAC='nice tar cpzf'

readarray -t hosts < workers.host

len=${#hosts[@]};
processed=0;

while read -r -a line; do

  let hostnum=processed%len;

  ssh ${hosts[$hostnum]} -i /root/.ssh/id_rsa "$DOMBAC - ${line[0]}" > "/data/backup/$DDAY/${line[1]}_${DATA}_FULL.tgz"

  let processed+=1;
done < paths

Esto funciona bien, sin embargo los procesos paso a paso en la máquina cuando la máquina. Los anfitriones son muy dominado y de la red no es un problema aquí, así que yo quería para paralelizar esto tanto como sea posible. Por ejemplo de ejecución de 4 instancias de comando tar en cada host y salida de la tubería a través de ssh en el correctamente el nombre del archivo. Estoy completamente perdido con el paralelo --results --sshloginfile... Y lo que en última instancia, tratar de lograr es tener 4 trabajos que se ejecutan en cada host, cada uno con diferentes parámetros (por ejemplo, host 2 no sobrescribir lo que host 1 ya lo hice). Se puede hacer esto en GNU Paralelo?

1voto

Ole Tange Puntos 1305

En primer lugar usted necesita saber cómo extraer múltiples argumentos a partir de una sola línea de entrada:

cat paths | parallel --colsep ' ' echo {2} == {1}

(Tomo nota de que algunos de los {2} puede ser generado a partir de {1}. Si ese es siempre el caso, es posible que desee buscar en {= =}; pero eso es una historia para otra pregunta).

Para ejecutar trabajos de forma remota utilice -S:

cat paths | parallel --colsep ' ' -S server echo {2} == {1}

Para el control de cuántos puestos de trabajo se ejecutan en un servidor remoto uso -j:

cat paths | parallel --colsep ' ' -j4 -S server echo {2} == {1}

Para obtener el resultado se almacena localmente --return --cleanup se puede utilizar:

cat paths | parallel --return {2} --cleanup --colsep ' ' -j4 -S server echo {2} == {1} '>' {2}

Como se desea que la salida se almacena en diferentes directorios a nivel local, usted tendrá que utilizar el /./ truco:

cat paths | parallel --return my/local/dir/./{2} --cleanup --colsep ' ' -j4 -S server echo {2} == {1} '>' {2}

El uso de un especial ssh uso de un comando --ssh:

parallel --ssh "ssh -i $HOME/.ssh/id_rsa.pub -lroot" --return {2} --cleanup --colsep ' ' -j4 -S server echo {2} == {1} '>' {2}

Para que se ejecute en varios servidores, uso --slf en lugar de -S:

parallel --slf hosts.txt --ssh "ssh -i $HOME/.ssh/id_rsa.pub -lroot" --return {2} --cleanup --colsep ' ' -j4 echo {2} == {1} '>' {2}

Así que en total, el comando podría tener este aspecto:

parallel --slf hosts.txt --ssh "ssh -i $HOME/.ssh/id_rsa.pub -lroot" --return /data/backup/$DDAY/./{2}_${DATA}_FULL.tgz --cleanup --colsep ' ' -j4 "$DOMBAC - {1} > {2}_${DATA}_FULL.tgz"

0voto

Argonauts Puntos 783

Usted podría utilizar en paralelo para lograr esto, pero creo que sería excesivo para lo que usted está tratando de lograr. En lugar de simplemente usaría los trabajos en segundo plano para ejecutar estos comandos (cerca de) al mismo tiempo.

Para lograr esto con un mínimo de cambios en su secuencia de comandos existente, todo lo que necesitamos está en el fondo de cada tarea a ejecutar (mediante el operador & para ello). Con el fin de evitar procesos huérfanos, debemos asegurarnos de que la secuencia de comandos no salir hasta que todos los trabajos han terminado, y que se logra con el bash builtin wait. Los trabajos de comando mostrará una lista de tareas en ejecución (que no puede ser todo de ellos, puede que algunos ya hayan terminado antes de llegar a ese punto, dependiendo de el tiempo de ejecución).

Tampoco estoy seguro de por qué se está utilizando el comando nice sin un argumento - yo creo que sin un argumento todo lo que va a hacer es imprimir la prioridad relativa de la puesta en marcha de la tarea, que supongo que podría ser su intención.

Aquí es una versión modificada de su secuencia de comandos con estos cambios

#!/bin/bash

echo "Run this on 192.168.130.10";

DATA=`date +%F`
DDAY=`date +%u`
DOMBAC='nice tar cpzf'

readarray -t hosts < workers.host

len=${#hosts[@]};
processed=0;

while read -r -a line; do

  let hostnum=processed%len;

  ssh ${hosts[$hostnum]} -i /root/.ssh/id_rsa "$DOMBAC - ${line[0]}" > "/data/backup/$DDAY/${line[1]}_${DATA}_FULL.tgz" &

  let processed+=1;
done < paths
jobs
wait

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: