我最近发现了这个xargs --max-procs
功能。
如何按 proc 拆分命令的输出?我应该只创建一个 mycommand --logfile $LOGFILE
,还是可以从 xargs 本身执行此操作?
一个例子(针对womble):
假设我有脚本 myprocessor.sh 和一个文件列表。它们可以按任何顺序运行,但我希望将每个文件的日志记录分开,然后:
find $MY_FILE_TREE --print0 | xargs --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh
可能是我想要运行的并行作业。如果myprocessor.sh
是多嘴的,那么我希望能够让每次调用都打印到不同的日志中。否则每次调用的标准输出都相同,日志就会变得混乱。
答案1
您可以通过 shell 运行 xargs 命令来执行此操作 - 这将允许您重定向输出 - 如下所示:
find blah -type f | xargs -I{} -P 4 -n 1 sh -c 'yourcommand --input {} > {}.output'
...你可能需要稍微调整一下 - xargs 将 {} 替换为其正在处理的项目/文件
答案2
GNU 并行http://www.gnu.org/software/parallel/似乎是为您制作的,因为它可以自动正确地组合来自各个进程的标准输出。
find $MY_FILE_TREE --print0 | parallel --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh ">" {}.output
或更短:
find $MY_FILE_TREE --print0 | parallel -0 -j3 -r myprocess.sh ">" {}.output
答案3
您可以更改脚本,使其在启动时选择一个随机数字/文本,然后在每行前面加上这个数字?然后,您可以使用 grep 对其进行拆分。