Я выполняю несколько команд запросов на удаленном хосте с параллельным 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;
Встретьтесь Параллель 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 .