如何正确同时执行多个f90代码?

时间:2012-08-01 10:04:26

标签: linux bash fortran90

我这样想,但确定它是可以改进的,因为bash因某种原因无法完成......

  #!/bash/bin

  cd directory
  gfortran -O3 code1.f90 -o a1.out
  gfortran -O3 code2.f90 -o a2.out
  gfortran -O3 code3.f90 -o a3.out
  gfortran -O3 code4.f90 -o a4.out
  gfortran -O3 code5.f90 -o a5.out
  gfortran -O3 code6.f90 -o a6.out

  ./a1.out & ./a2.out & ./a3.out & ./a4.out & ./a5.out & ./a6.out 

  echo fin

非常感谢!

更新:

我试过这样的: cd BC_EQ

  nohup sh -c "gfortran -O3 -fopenmp LBM_Re100_N150_Ma01_BC_Eq.f90  -o a1.out && ./a1.out " &
  nohup sh -c "gfortran -O3 -fopenmp LBM_Re100_N150_Ma015_BC_Eq.f90 -o a2.out && ./a2.out " &
  nohup sh -c "gfortran -O3 -fopenmp LBM_Re100_N150_Ma02_BC_Eq.f90  -o a3.out && ./a3.out " &
  nohup sh -c "gfortran -O3 -fopenmp LBM_Re125_N150_Ma01_BC_Eq.f90  -o a4.out && ./a4.out " &
  nohup sh -c "gfortran -O3 -fopenmp LBM_Re125_N150_Ma015_BC_Eq.f90 -o a5.out && ./a5.out " &
  nohup sh -c "gfortran -O3 -fopenmp LBM_Re125_N150_Ma02_BC_Eq.f90  -o a6.out && ./a6.out " &

echojaestà

但最终吐了:

nohup:将输出附加到nohup.out' nohup: nohup: appending output to nohup.out' 将输出附加到“nohup.out”

6个代码中只有4个正在执行,并且它们不会像以前那样在屏幕上吐出任何东西..为什么??

然后如果我尝试:

    #!/bash/bin

   cd BC_EQ

   gfortran -O3 -fopenmp LBM_Re100_N150_Ma01_BC_Eq.f90  -o a1.out && ./a1.out &
   gfortran -O3 -fopenmp LBM_Re100_N150_Ma015_BC_Eq.f90 -o a2.out && ./a2.out &
   gfortran -O3 -fopenmp LBM_Re100_N150_Ma02_BC_Eq.f90  -o a3.out && ./a3.out &
   gfortran -O3 -fopenmp LBM_Re125_N150_Ma01_BC_Eq.f90  -o a4.out && ./a4.out &
   gfortran -O3 -fopenmp LBM_Re125_N150_Ma015_BC_Eq.f90 -o a5.out && ./a5.out &
   gfortran -O3 -fopenmp LBM_Re125_N150_Ma02_BC_Eq.f90  -o a6.out && ./a6.out 

   echo ja està

它说错误: 致命错误:无法删除临时模块文件'cellconst.mod0':没有此类文件或目录 致命错误:无法删除临时模块文件'cellconst.mod0':没有此类文件或目录 致命错误:无法删除临时模块文件'cellconst.mod0':没有此类文件或目录 致命错误:无法删除临时模块文件'cellconst.mod0':没有此类文件或目录 致命错误:无法删除临时模块文件'd2q9const.mod0':没有此类文件或目录

._·

3 个答案:

答案 0 :(得分:1)

在最后一个a6.out之后添加一个&符号。

答案 1 :(得分:1)

问题在于,您必须在每个要在后台运行的命令之后添加amersand。这意味着在a6之后:./a6.out &

但我建议你使用for来自动化这个过程:

for i in {1..6}
do
  nohup ./a$i.out &
done

你也可以并行编译:

for i in {1..6}
do
  nohup sh -c "gfortran -O3 code$i.f90 -o a$i.out && ./a$i.out" &
done

答案 2 :(得分:0)

试试这个:

 ./a1.out &
 PIDS=$!
 ./a2.out &
 PIDS="$PIDS "$!
 ./a3.out &
 PIDS="$PIDS "$!
 ./a4.out &
 PIDS="$PIDS "$!
 ./a5.out &
 PIDS="$PIDS "$!
 ./a6.out &
 PIDS="$PIDS "$!

 wait $PIDS

更新:

$! :man bash /Special Parameters:扩展为最近执行的后台(异步)命令的进程ID。

PIDS是一个变量,它将包含由空格分隔的进程ID,以便扩展提供一个等待的参数列表