2014-10-02 130 views
1

我正在处理由xargs产生的多个并行进程的文本文件。我还需要将每个进程的stdout捕获到一个单独的日志文件中。下面是一个例子,其中每个进程的输出交织到一个文件中 - 而不是我想要的。Bash:从多个xargs并行进程记录stdout以分离日志文件

理想地,每个日志文件应由文件行号进行编号,即,日志文件-1,日志文件-2等

cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile 

这将是很好,如果能够避免外部包装脚本,但是如果有一种方法可以用my文件包装myScript,那就行了。

+1

在myScript.sh里面做一个'exec> logfile - $$'或者其他的?基本上脚本控制它的日志记录而不是'xargs'尝试它。 – bishop 2014-10-02 20:09:58

回答

1

试试这个:

nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$1" > logfile-$0' 

这是假设在inputfile.txt每个参数都在自己的路线,并且不包含空格。命令nl命令每一行编号,它将每个参数与唯一编号进行配对。 xargs命令在时间上有两个参数,第一个是行号,第二个是从inputfile.txt开始的对应行,并将它们传递给shsh命令使用参数分别生成输出文件名和参数myScript.sh

+0

''$ 1“',而不是裸”$ 1“,但非常正确的想法。 – 2014-10-02 21:50:47

+0

它可能没有区别,因为'xargs'在空格处分隔参数,但是我认为'inputfile.txt'可能有引用的参数。 – 2014-10-02 21:55:28

+0

@Ross,聪明的解决方案。除了日志文件,我还希望屏幕上的输出。它似乎与一个小的改变:nl inputfile.txt | xargs -n 2 -P 8 sh -c'./myScript.sh“$ 1”| tee logfile- $ 0' – Steve 2014-10-03 12:28:24

2

你可以使用GNU并行,而不是和它-k选项,以保持输出顺序,在一个日志文件:

cat input | parallel -k ./myScript.sh > file.log 

您可以parallel后添加-j 8保持8个内核忙碌,但它会继续无论如何,所有内核都默认忙碌。

+0

你看过GNU并行的源代码吗?使鼠巢看起来像组织模型。 – 2014-10-02 21:51:27

+0

@CharlesDuffy我实际上已经和我一致认为这很难阅读,但我的经验是,它每次使用它都会起到一定的作用。我也发现它很难读取Linux内核...... :-) – 2014-10-02 21:55:45

+0

@CharlesDuffy只要不破坏当前的功能,改进总是受欢迎的。 – 2014-10-07 08:12:20

相关问题