Как заставить xargs выполняться параллельно, но показывать полный вывод одного экземпляра за раз?

Я выполняю несколько команд запросов на удаленном хосте с параллельным xargs, который работает эффективно и очень хорошо, но у меня есть некоторые проблемы с поиском, с какого хоста я получаю запрос.

Прямо сейчас часть скрипта, которая делает это, выглядит точно так:

export commands="cmd1; cmd2; "
hosts=("host1" "host2" "host3" "host4")
MaxInstance=10
echo_var(){
   echo "Executing in $1:"; sleep 1; echo "Output of: $commands"; return 0;
}
export -f echo_var
printf "%s\n" ${hosts[@]} | xargs -n 2 -P $MaxInstance -I {} $(command -v bash) -c 'echo_var "$1"' _ {}

, который должен выводить примерно так из-за sleep 1:

Executing in host1:
Executing in host2:
Executing in host3:
Executing in host4:
Output of: cmd1; cmd2; 
Output of: cmd1; cmd2; 
Output of: cmd1; cmd2; 
Output of: cmd1; cmd2;

Чтобы получить результат, который может выглядеть аналогично показанному в конце, мне нужно отредактировать существующие функции следующим образом, чтобы приблизиться к тому, что я хотел. Но даже здесь, если я использую printf "%s\n%s" "$name" "$output", он иногда ломается на новой строке. Например:

echo_var(){
 name="Executing in $1:"; sleep 1; output="Output of: $commands";
 echo -e "$name: $output" ## will work
 # echo -e "$name\n$output" ## will not work or even
 # printf "%s\n%s" "$name" "$output" ## will not work
 return 0;
}

Не жертвуя скоростью параллельного выполнения, я хотел бы получить вывод, подобный следующему. Есть ли какая-либо опция в xargs, чтобы указать, чтобы показывать выходные данные всего экземпляра за один раз?

Executing in host1:
Output of: cmd1; cmd2;
Executing in host2:
Output of: cmd1; cmd2;
Executing in host3:
Output of: cmd1; cmd2;
Executing in host4: 
Output of: cmd1; cmd2; 
2
задан 26 November 2019 в 04:53

1 ответ

Встретьтесь Параллель GNU ( sudo apt install parallel ):

параллель GNU удостоверяется, что вывод от команд является тем же выводом, как Вы сделать Вас выполнить команды последовательно.
, Если Вы используете xargs и кладете для первого удара сегодня, Вы найдете параллель GNU очень простой в использовании, поскольку параллель GNU записана, чтобы иметь те же опции как xargs.

я can’t тестируют его, но команда в Вашем случае должна просто быть:

parallel -n 2 -P $MaxInstance $(command -v bash) -c 'echo_var "$1"' _ {}

Примечание, что moreutils пакет обеспечивает parallel команда, которая отличается от параллели GNU.

Пример работает

Этот пример выполнения echo {} start; sleep 1; echo {} ready для аргументов 1, 2 и 3, сначала с xargs и затем с [1 110]:

$ echo -e '1\n2\n3' | xargs -n1 -P3 -I{} bash -c 'echo {} start; sleep 1; echo {} ready'
2 start
1 start
3 start
2 ready
1 ready
3 ready
$ parallel 'echo {} start; sleep 1; echo {} ready' ::: 1 2 3
1 start
1 ready
2 start
2 ready
3 start
3 ready

, Конечно, эти echo | подход действительно работает наравне с [1 112], я точно так же, как его функция списка аргументов, показанная выше †“, он делает то же самое.

, Если you’re hesistant для использования parallel, потому что it’s не предварительно установил, трудно для устанавливания/обновления или что-либо как этот я тепло, рекомендуют программу author’s статья блога о [1 116] Оправдания за то, что не была установлена Параллель GNU .

3
ответ дан 2 December 2019 в 02:38

Другие вопросы по тегам:

Похожие вопросы: