在Linux中并行运行bash脚本

时间:2016-01-28 18:11:59

标签: linux bash shell parallel-processing

我正在尝试运行脚本(1.sh)

spin -a  /home/files/1/1.pml; 
gcc -O2 -DXUSAFE -DSAFETY -DNOCLAIM -w -o pan pan.c >log1.txt; 
./pan -m100000 >log2.txt; 
spin -p -s -r -X -v -n123 -l -g -k /home/files/1/1.pml.trail \
    -u10000 /home/files/1/1.pml >log3.txt;

命令spin -a ...;生成临时文件(pan.c,pan.h),由下一个gcc -O2..命令使用。如果我在终端中运行脚本,它会在同一位置创建临时文件。

我想并行运行多个脚本。我尝试了两件事,首先编写一个脚本然后在后台循环中运行(parallel.sh)

for((i=1;i<1800;i++))
 do 
   /home/files/$i/$i.sh & 
 done

其次使用并行gnu parallel -j0 sh /home/files/{}/{}.sh ::: {1..1800}

两种方法都在调用它们的位置创建了临时文件,而不是脚本位置。

例如,如果我运行脚本&#39; parallel.sh&#39;来自home/files的临时文件是在&#34; home / files&#34;中创建的。而不是位置&#34; home / files / 1&#34;,&#34; home / files / 2&#34;等。

请建议一种方法,以便脚本1.sh,2.sh,..生成的临时文件分别在目录/home/file/1//home/files/2/,..中创建并行脚本parallel.sh或来自位置/home的终端中的并行GNU。

2 个答案:

答案 0 :(得分:1)

诀窍是更改每个命令的工作目录。

如果您的计算机可以同时运行多达1800个这样的过程而不会使气候升温:

for i in {1..1800}; do (cd $i && ./$i.sh) & done

当并行运行,并且您的进程是cpu绑定的时,它通常在运行超过处理器数量时不会获得吞吐量:

seq 1 1800 | xargs -n1 -P8 -I% sh -c 'cd % && ./%.sh'

答案 1 :(得分:0)

尝试:

parallel 'cd /home/files/{}; sh {}.sh' ::: {1..1800}

它将为每个核心运行一个进程,并且可能比'-j0'更快(只有测试才能确定)。

如果您的脚本仅因编号而异,请考虑将其重写为将数字作为参数的通用脚本或bash函数:

spinit() {
    num=$1
    spin -a  /home/files/$num/$num.pml; 
    gcc -O2 -DXUSAFE -DSAFETY -DNOCLAIM -w -o pan pan.c >log1.txt; 
    ./pan -m100000 >log2.txt; 
    spin -p -s -r -X -v -n123 -l -g -k /home/files/$num/$num.pml.trail \
        -u10000 /home/files/$num/$num.pml >log3.txt;
}
export -f spinit
parallel 'cd /home/files/{}; spinit {}' ::: {1..1800}