Bash:将来自多个xargs并行进程的stdout记录到单独的日志文件中
我正在使用xargs生成的多个并行进程处理一个文本文件。我还需要将每个进程的标准输出捕获到一个单独的日志文件中。下面是一个示例,其中每个进程的输出被交织到一个文件中——这不是我想要的 理想情况下,每个日志文件应按文件行号编号,即logfile-1、logfile-2等Bash:将来自多个xargs并行进程的stdout记录到单独的日志文件中,bash,stdout,xargs,tee,Bash,Stdout,Xargs,Tee,我正在使用xargs生成的多个并行进程处理一个文本文件。我还需要将每个进程的标准输出捕获到一个单独的日志文件中。下面是一个示例,其中每个进程的输出被交织到一个文件中——这不是我想要的 理想情况下,每个日志文件应按文件行号编号,即logfile-1、logfile-2等 cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile 如果可能的话,最好避免使用外部包装器脚本,但是如果有一种方法可以用here文档包装myScript,
cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile
如果可能的话,最好避免使用外部包装器脚本,但是如果有一种方法可以用here文档包装myScript,那就行了。试试以下方法:
nl inputfile.txt | xargs-n2-p8 sh-c'/myScript.sh“$1”>logfile-$0'
这假定
inputfile.txt
中的每个参数都在自己的行中,并且不包含空格。nl
命令对每一行进行编号,这会将每个参数与唯一的编号配对。xargs
命令一次接受两个参数,第一个参数是行号,第二个参数是来自inputfile.txt
的相应行,并将它们传递给sh
。sh
命令使用参数分别生成输出文件名和myScript.sh
的参数。您可以使用GNU Parallel及其-k
选项在单个日志文件中保持输出有序:
cat input | parallel -k ./myScript.sh > file.log
您可以将
-j8
添加到parallel
之后,使8个内核保持忙碌状态,但默认情况下,它将使所有内核保持忙碌状态。在myScript.sh中执行exec>logfile-$$
或类似操作?基本上,脚本控制它的日志记录,而不是尝试它。“$1”
,而不是裸露的$1
,但这个想法非常正确。它可能没有什么区别,因为xargs
在空格处拆分参数,但我想inputfile.txt
可能引用了参数。@Ross,聪明的解决方案。除了日志文件外,我还希望屏幕上显示输出。它似乎有一个小改动:nl inputfile.txt | xargs-n2-p8 sh-c'/myScript.sh“$1”| tee logfile-$0'您查看过GNU并行的源代码了吗?让老鼠窝看起来像是良好组织的典范。@CharlesDuffy我确实有,我同意这很难阅读,但我的经验是,每次我使用它时,它都能起到很好的作用。我还发现读Linux内核也很难…:-)@CharlesDuffy的改进总是受欢迎的,只要它不破坏当前的功能。