我有一个我想在多个文件上运行的脚本
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',为什么它不起作用?还有一种“更好”的方法吗?
答案 0 :(得分:2)
GNU Parallel就是这样做的:
parallel my_script ::: files*
您可以在http://www.gnu.org/s/parallel/找到有关GNU Parallel的更多信息 你可以在10秒内安装GNU Parallel:
wget -O - pi.dk/3 | sh
观看http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
上的介绍视频编辑:
如果没有安装不安装GNU Parallel的原因 http://oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html 那你愿意详细说明原因吗?
答案 1 :(得分:0)
my_script中必须有一个退出语句。用return语句替换exit语句。
要检查的另一件事是同一文件包含在多个列表中的可能性。处理中可能存在争用问题 - 文件已在处理中,另一个进程尝试打开同一文件。使用 - :
检查任何重复文件sort file_[1-5] | uniq -d
答案 2 :(得分:0)
作为GNU parallel的替代方法,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。