我试图了解 GNU Parallel 中 --nonall 和 --onall 选项的行为,以及它们如何与 --delay 选项交互。我遇到过一些行为不符合预期的情况,希望得到一些澄清。
parallel --nonall --jobs 1 echo "1" ::: a a a
parallel --onall --jobs 1 echo "1" ::: a a a
结果是一样的。那么有什么区别呢?
parallel --nonall --jobs 1 --delay 5s echo "1" ::: a a a
每个输入的命令执行之间似乎没有任何延迟。但是,当我使用 --onall 而不是 --nonall 时,延迟会按预期应用。
parallel --onall --jobs 1 --delay 5s echo "1" ::: a a a
您能否解释一下为什么 --delay 选项与 --nonall 一起使用时似乎没有效果,但与 --onall 一起使用时却按预期工作?
您将进入尚未经过充分测试的领域。因此,您会发现一些可能被视为错误的令人惊讶的行为。
首先:
--(n)onall
在本地运行没有任何意义。他们只与服务器打交道(--sshlogin/-S
):
# "echo 1" is run on all servers
$ parallel -S server1,server2 --nonall echo 1
1
1
# "echo 1 a" "echo 1 b" "echo 1 c" are run on all servers
$ parallel -S server1,server2 --onall echo 1 ::: a b c
1 a
1 b
1 c
1 a
1 b
1 c
确实
--nonall
也对命令行上的参数做出反应:
$ parallel -S server1,server2 --nonall echo 1 ::: a b c
1 a
1 b
1 c
1 a
1 b
1 c
您可以认为这是一个错误,或者您正在以未定义的方式使用它:应该忽略参数。
如果您在标准输入 (stdin) 上给出参数,则输入确实会被
--nonall
: 忽略
# Standard input (stdin) is ignored
$ (echo a;echo b;echo c) | parallel -S server1,server2 --nonall echo 1
1
1
# Standard input (stdin) is used
$ (echo a;echo b;echo c) | parallel -S server1,server2 --onall echo 1
1 a
1 b
1 c
1 a
1 b
1 c
目前
--delay
被忽略。
您可以随意在邮件列表上发布您认为
--delay
与 --(n)onall
结合时应该做什么。如果您这样做,还请说明 --sshdelay
的行为应有何不同。