我正在通过GNU Parallel教程工作。在“多个参数”部分中,有以下示例(注意:num30000是一个文本文件,其顺序行上的数字为1到30,000):
为了获得更好的并行性,当满足文件结尾时,GNU Parallel可以在所有并行作业之间分配参数。
并行运行4个作业会将参数的最后一行拆分为4个作业,从而导致总共5个作业:
Run Code Online (Sandbox Code Playgroud)cat num30000 | parallel --jobs 4 -m echo | wc -l输出:
Run Code Online (Sandbox Code Playgroud)5
我的问题是:为什么我们期望有5个职位?尽管我不知道这很重要,但我显然遗漏了一点。我预计会有4个工作,因为30,000被4整除。我决定运行以下命令后发布此问题:
cat num30000 | parallel --jobs 4 -m echo | colrm 12
Run Code Online (Sandbox Code Playgroud)
结果是:
1 2 3 4 5 6
23696 23697
25273 25274
26850 26851
28427 28428
Run Code Online (Sandbox Code Playgroud)
在我看来,这就像第一个echo命令传递了前23695个参数一样。然后,将剩余的工作分解为另外4个作业,其参数计数分别为1577、1577、1577和1574。我是否误解了对parallel的调用应该做什么?谢谢!
假设我使用以下gnu parallel命令运行N个作业:
seq $N | parallel -j 0 --progress ./job.sh
Run Code Online (Sandbox Code Playgroud)
如何调用并行来杀死所有正在运行的作业,并且只要其中任何一个退出就不再接受它们?
我有程序(gawk)将数据流输出到其STDOUT.处理的数据实际上是10英镑.我不想将它保存在单个文件中,而是将其拆分为块,并可能在保存之前对每个文件应用一些额外的处理(如压缩).
我的数据是一系列记录,我不想拆分将记录减半.每条记录都匹配以下正则表达式:
^\{index.+?\}\}\n\{.+?\}$
或者为了简单起见,可以假设两行(首先是不均匀的,甚至在从流的开始编号时)始终记录.
我可以吗:
我已经意识到像GNU并行的命令,csplit但不知道如何把它放在一起.如果上面解释的功能可以在不编写自定义perl脚本的情况下实现,那将是很好的.然而,这可能是另一个,最后的解决方案,但再次,不知道如何最好地实现它.
我需要并行运行一些命令,包括 SCP。为此,我使用 GNU Parallel。问题是我不知道如何将密码传递给 SCP。这是与我正在运行的类似的一行:
ls 2011_* | parallel scp {} user@domain
Run Code Online (Sandbox Code Playgroud)
如果ls找到3个文件,scp同时询问3次密码,我只能将密码输入到最后一个进程来提示输入。
我暂时解决了使用公钥连接的问题,但由于公司政策,这在将来不会成为一个选择。我阅读了 SCP 手册页,但找不到选项,但我非常有信心 Parallel 应该有一个选项允许我输入密码。
有人知道解决这个问题的方法吗?
编辑:我想知道是否有一种方法可以告诉parallel密码,以便它可以在scp每次询问时提供密码。也许有这样的事情:
ls 2011_* | parallel scp {} user@domain < file_with_password.txt
Run Code Online (Sandbox Code Playgroud)
但指定重定向STDIN是 forscp而不是 for lsor parallel。
我想这个问题/问题可以通过满足以下一个(或多个)问题来解决
1) 如何显示剩余的工作?2)我如何漂亮的输出--eta
1) 我已经检查了手册页,我目前在我的函数中使用 $PARALLEL_SEQ,但是我怎样才能获得剩余的工作?Parallel 帮助我编译了大约 800 个文件,我想知道我的剩余工作。
2)或者,有没有更好(更好)的输出方式--eta?我的输出看起来很乱。我只想看到一个 ETA。
我使用的并行标志: --no-notice --keep-order --group
输出示例:
819: Compiling form: USER_Q ok
ETA: 8s 13left 0.61avg local:4/819/100%/0.6s
820: Compiling form: USER_RESERVE_STOCK ok
ETA: 7s 12left 0.61avg local:4/820/100%/0.6s
821: Compiling form: USERS_AUTO ok
ETA: 7s 11left 0.61avg local:4/821/100%/0.6s
822: Compiling form: USERS ok
ETA: 6s 10left 0.61avg local:4/822/100%/0.6s
823: Compiling form: USERS_MENU ok
ETA: 6s 9left 0.61avg local:4/823/100%/0.6s
824: Compiling form: USER_SUPP ok
ETA: 4s 8left 0.61avg local:4/824/100%/0.6s
825: …Run Code Online (Sandbox Code Playgroud) 嵌套调用的正确方法是GNU parallel什么?
愚蠢的例子:
seq 1 100 | parallel echo {} | parallel seq {} 1000
Run Code Online (Sandbox Code Playgroud)
我的理解是,在 8 个 CPU 的机器上,每个并行将启动 8 个作业,总共 64 个作业。如果您调用的内容比seq这更重要,则可能会使盒子过载。有没有办法限制作业数量但仍然充分利用并行性?
正如标题中所说,我想知道该-k选项(强烈)是否会影响 GNU 并行的速度。
在man parallel_tutorial存在关于讨论--ungroup和--line-buffer,其声称--linebuffer,其unmixes输出线,比要慢得多--ungroup。那么-k当工作数量很大时,也许也会导致大幅放缓?
(我没有在man parallel或 中找到这个主题man parallel_tutorial;我也没有在谷歌上找到任何东西。不过我还没有完成man parallel,所以如果我错过了一些搜索较少的东西,请原谅。)
在 bash 中,我正在运行 GnuPG 来解密一些文件,并且我希望将输出重定向到具有相同名称但具有不同扩展名的文件。基本上,如果我的文件被命名
file1.sc.xz.gpg
Run Code Online (Sandbox Code Playgroud)
运行 GnuPG 工具后出现的文件我想存储在另一个名为
file1.sc.xz
Run Code Online (Sandbox Code Playgroud)
我目前正在尝试
find . -type f | parallel "gpg {} > {}.sc.xz"
Run Code Online (Sandbox Code Playgroud)
但这会生成一个名为 file1.sc.xz.gpg.sc.xz 的文件。我怎样才能做到这一点?
稍后编辑:我想在一个单独的 bash 命令中执行此操作,而无需事先知道文件名。
我正在尝试使用不同的参数并行化粒子模拟以节省一些时间。因此,我想GNUparallel用于为不同的参数运行 bash 脚本。该脚本读取一个文件,然后执行模拟,例如:
$bash script <<< input file
然而:-
$cd ~/parameter_files ls | parallel bash script <<< {}
根本不起作用。我是 Linux 和 GNUparallel 的新手,所以希望有人可以提供帮助。
假设我在从标准输入接收的一组项目上并行运行 gnu,并根据某些标准进行拆分:
cat content | parallel -j 4 my_command
Run Code Online (Sandbox Code Playgroud)
如何访问作业编号,以便我可以将并行执行的作业编号/ID 作为参数传递给命令(以便每个并行执行块具有唯一编号):
cat content | parallel -j 4 my_command -n ???
Run Code Online (Sandbox Code Playgroud)
(这甚至可能吗?现在查看手册页)