Usando xargs em vez de GNU Parallel

0

O GNU Parallel pode gerar todas as combinações de entrada, exportar uma função e executá-la em 3 servidores remotos sem misturar a saída, repetindo o comando se ele falhar:

#!/bin/bash

env_parallel --record-env
process_output() {
  perl -ne '$/=undef; $|=1; @a=split//;
      while(@a){
        print ".",shift @a;
        select($a,$a,$a,0.100);
      }';
}
env_parallel --env _ --retries 4 -Sserver{1..3},: \
  'echo X={1} Y={2} Z={3} | process_output' \
  ::: "a'  \"b"{1..3} ::: "c\"  'd"{3..4} ::: "e\$  f'"{7..8}

Saída:

.X.=.a.'. . .".b.1. .Y.=.c.". . .'.d.3. .Z.=.e.$. . .f.'.7.
.X.=.a.'. . .".b.1. .Y.=.c.". . .'.d.3. .Z.=.e.$. . .f.'.8.
.X.=.a.'. . .".b.1. .Y.=.c.". . .'.d.4. .Z.=.e.$. . .f.'.7.
.X.=.a.'. . .".b.1. .Y.=.c.". . .'.d.4. .Z.=.e.$. . .f.'.8.
.X.=.a.'. . .".b.2. .Y.=.c.". . .'.d.3. .Z.=.e.$. . .f.'.7.
.X.=.a.'. . .".b.2. .Y.=.c.". . .'.d.3. .Z.=.e.$. . .f.'.8.
.X.=.a.'. . .".b.2. .Y.=.c.". . .'.d.4. .Z.=.e.$. . .f.'.7.
.X.=.a.'. . .".b.2. .Y.=.c.". . .'.d.4. .Z.=.e.$. . .f.'.8.
.X.=.a.'. . .".b.3. .Y.=.c.". . .'.d.3. .Z.=.e.$. . .f.'.7.
.X.=.a.'. . .".b.3. .Y.=.c.". . .'.d.3. .Z.=.e.$. . .f.'.8.
.X.=.a.'. . .".b.3. .Y.=.c.". . .'.d.4. .Z.=.e.$. . .f.'.7.
.X.=.a.'. . .".b.3. .Y.=.c.". . .'.d.4. .Z.=.e.$. . .f.'.8.

xargs -P$(nproc) pode executar um trabalho por processador.

Dado

  • a função process_output ,
  • os servidores para serem executados em (server1, server2, server3),
  • os grupos de argumentos ( a' "b1, a' "b2, a' "b3 ; c" 'd1, c" 'd2, c" 'd3 ; e$ f'7, e$ f'8 )

como você pode emular o GNU Parallel usando xargs para fazer o mesmo usando process_output e os servidores?

    
por Ole Tange 19.11.2017 / 07:44

0 respostas

Tags