【问题标题】:Running bash scripts parallel in Linux在 Linux 中并行运行 bash 脚本
【发布时间】:2016-01-28 18:11:58
【问题描述】:

我正在尝试运行脚本 (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}

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

例如,如果我从home/files 运行脚本“parallel.sh”,则临时文件将在“home/files”而不是“home/files/1”、“home/files/2”位置创建,等等

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

【问题讨论】:

  • 最简单的解决方法是将cd 命令添加到您的脚本中,以便每次调用都转到您想要的目录。

标签: linux bash shell parallel-processing


【解决方案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'

【讨论】:

    【解决方案2】:

    试试:

    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}
    

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2011-07-29
      • 2023-01-12
      • 1970-01-01
      • 2012-11-21
      相关资源
      最近更新 更多