Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:将来自多个xargs并行进程的stdout记录到单独的日志文件中_Bash_Stdout_Xargs_Tee - Fatal编程技术网

Bash:将来自多个xargs并行进程的stdout记录到单独的日志文件中

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,

我正在使用xargs生成的多个并行进程处理一个文本文件。我还需要将每个进程的标准输出捕获到一个单独的日志文件中。下面是一个示例,其中每个进程的输出被交织到一个文件中——这不是我想要的

理想情况下,每个日志文件应按文件行号编号,即logfile-1、logfile-2等

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的改进总是受欢迎的,只要它不破坏当前的功能。