Параллельные ошибки GNU на —all - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь отправить bash функцию через s sh и выполнить ее на всех удаленных хостах. Примерно так:

f() { echo $1; }
parallel -—onall -S host1,host2 “$(typeset -f f); f” ::: foo

Однако, это приводит к следующей ошибке:

/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
/bin/bash: -c: line 1: syntax error: unexpected end of file
/bin/bash: \{\ : command not found
/bin/bash: \ \ \ \ echo\ \$1: command not found
/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
/bin/bash: -c: line 1: syntax error: unexpected end of file
/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
/bin/bash: -c: line 1: syntax error: unexpected end of file
/bin/bash: \{\ : command not found
/bin/bash: \ \ \ \ echo\ \$1: command not found
/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
/bin/bash: -c: line 1: syntax error: unexpected end of file

Весь этот фрагмент отлично работает, если я удаляю - -allall и запускаю функцию только на одном хосте :

parallel -S host1,host2 “$(typeset -f f); f” ::: foo

Дает вывод: foo

Любое понимание того, что может быть не так, поможет :-). Я использую версию 20180422.

1 Ответ

1 голос
/ 03 апреля 2020

Вы ищете env_parallel:

f() { echo foo; echo "$@"; }
env_parallel -S host1,host2 --onall f ::: a b c

Если вы получаете:

bash: /usr/bin/perl: Argument list too long
env_parallel: Error: Your environment is too big.
env_parallel: Error: You can try 3 different approaches:
env_parallel: Error: 1. Run 'env_parallel --session' before you set
env_parallel: Error:    variables or define functions.
env_parallel: Error: 2. Use --env and only mention the names to copy.
env_parallel: Error: 3. Try running this in a clean environment once:
env_parallel: Error:      env_parallel --record-env
env_parallel: Error:    And then use '--env _'
env_parallel: Error: For details see: man env_parallel

Тогда попробуйте эти 3 различных подхода:

unset f
env_parallel --session
f() { echo foo; echo "$@"; }
env_parallel -S host1,host2 --onall f ::: a b c

или :

f() { echo foo; echo "$@"; }
env_parallel --env f -S host1,host2 --onall f ::: a b c

или:

unset f
env_parallel --record-env
f() { echo foo; echo "$@"; }
env_parallel --env _ -S host1,host2 --onall f ::: a b c

Подробнее см .: man env_parallel

Или обновление до 20180922:

parallel-20180922 --onall -S host1,host2 "$(typeset -f f); f" ::: a b c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...