1

我有一个要在多个文件上运行的脚本

my_script file_name

但是我有很多,所以我编写了一些代码,旨在通过首先创建5个我要处理的文件的“相等”列表,然后是这个

my_function() {
    while read i; do 
        my_script $i
    done < $1
}

my_function list_1 &
my_function list_2 &
my_function list_3 &
my_function list_4 &
my_function list_5 &

wait

这适用于每个列表中的第一个文件,但随后完成。如果我将功能更改为简单的回声它可以正常工作

my_function() {
    while read i; do 
        echo $i
    done < $1 
}

它按我的预期打印每个列表中的所有文件。

如果我使用 'my_script' 为什么它不起作用?有没有一种“更好”的方式来做到这一点?

4

3 回答 3

2

GNU Parallel is made for this:

parallel my_script ::: files*

You can find more about GNU Parallel at: http://www.gnu.org/s/parallel/ You can install GNU Parallel in just 10 seconds with:

wget -O - pi.dk/3 | sh 

Watch the intro video on http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Edit:

If the reason for not installing GNU Parallel is not covered by http://oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html would you then be kind to elaborate why?

于 2013-06-24T11:20:06.837 回答
0

my_script 中必须有退出语句。将退出语句替换为返回语句。

要检查的另一件事是同一文件包含在多个列表中的可能性。处理过程中可能存在争用问题 - 文件已在处理中,而另一个进程尝试打开同一文件。检查是否有任何重复文件-:

sort file_[1-5] | uniq -d
于 2013-06-24T11:16:24.737 回答
0

作为 GNU 并行的替代方案,还有https://github.com/mauvilsa/run_parallel,它只是 bash 中的一个函数,因此它不需要 root 访问或编译。

要使用它,首先获取文件

source run_parallel.inc.sh

然后在您的示例中,将其执行为

run_parallel -T 5 my_function 'list_{%}'

它还可以为您拆分列表

run_parallel -T 5 -l full_list -n split my_function '{@}'

要查看用法说明和一些示例,请执行不带任何参数的 run_parallel。

于 2016-07-30T09:29:12.797 回答