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