所以我遇到这样一种情况:我正在运行大量并行命令,并将输出传递给另一个消耗输出的脚本。我遇到的问题是我的输出处理脚本需要知道特定命令何时完成执行。
我正在使用--line-buffer
选项,以便我知道什么命令已生成输出但是当前我必须等到并行完成运行所有命令才能知道我不会再获得输出来自特定的命令。根据我对并行的理解,我看到了以下可能的解决方案,但没有一个真正适合我。
我可以使用--create a SQL file per schema
for i in $(psql -t -A -c "select nspname from pg_namespace where nspname not like 'pg_%' and nspname not like '%toolkit' and nspname not in ('information_schema', 'madlib', 'public') order by nspname;"); do
echo $i
pg_dump -s -n $i -f $i.sql
done
for i in $(ls *.sql); do
#your code to commit the changes to source control like git
done
选项对输出行进行分组
看起来像顺序运行。然后每当我看到输出
然而,从下一个命令我知道前一个已完成
这样做会减慢我的速度,因为一个命令可能需要30秒才能完成
完成后,它可能会有20个其他命令
一秒钟,我希望尽可能接近实时处理它们
可能。
我可以将命令包装在一个输出'Process'的小bash脚本中 使用一些ID DONE'来获取命令完成的通知。一世 不喜欢这个,因为我正在运行数百个命令 在一个时间,并不真的想添加所有这些额外的bash 过程
我真的希望我在文档中遗漏了一些东西,并且那里有一面旗帜可以做我正在寻找的东西。
我的理解是并行是在perl中实现的,我很满意,但除非完全必要,否则不必自己添加功能。
非常感谢任何帮助或建议。
答案 0 :(得分:2)
--tag
的默认行为应该可以正常运行。在完成工作之前,它不会输出任何内容。然后你的后处理器可以简单地从行的开头抓取参数。
示例:
parallel -j3 --tag 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6
如果您想保留订单:
parallel -j3 --keep-order --tag 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6
注意如果输出立即完成,作业将如何混合。与--ungroup
(您不想要的)比较:
parallel -j3 --ungroup 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6