如何将我的脚本转换为从Bash提交SLURM作业到Perl?

时间:2015-02-17 17:55:00

标签: bash perl slurm

我有以下Bash脚本用于将作业提交到群集上的SLURM

#!/bin/bash
#SBATCH -A 1234
#SBATCH -t 2-00:00 
#SBATCH -n 24

module add xxx
srun resp.com

#SBATCH行是SLURM命令:

  • #SBATCH -A 1234是项目编号(1234)
  • #SBATCH -t 2-00:00是工作时间
  • #SBATCH -n 24是核心数

module add xxx加载Environment Module xxx(在这种情况下,我实际上使用module add gaussian,其中gaussian是计算量子化学程序)。

srun是启动作业的SLURM命令。 resp.com包括高斯和原子坐标的命令。

我尝试将Bash脚本转换为以下Perl脚本,但它不起作用。我怎么能在Perl中做到这一点?

#!/usr/bin/perl 

use strict;
use warnings;
use diagnostics;

system ("#SBATCH -A 1234");
system ("#SBATCH -t 2-00:00");
system ("#SBATCH -n 24");

system ("module add xxx");
system ("srun resp.com ");

2 个答案:

答案 0 :(得分:3)

每个system调用都会创建一个子进程来运行有问题的程序,并在子进程终止时返回。

module的重点是配置当前shell,其中包括修改它的环境。当这个过程完成(死亡)时,告别那些变化。对srun的呼唤,在其新的过程中焕然一新,并且没有机会。

前进的步骤:

  • 了解SLURM& bash和完全为什么system("#SBATCH whatever");可能不是任何值。提示:#标志着Bash&的评论开始。的Perl。
  • 了解module add正在对xxx做什么,以及如何在Perl解释器中复制它在shell中所做的事情。 ThisSuitIsBlack不建议use Env::Modulecmd { load => 'foo/1.0' };复制此功能。
  • 除非对module add有任何理解,system ('module add xxx; srun resp.com')会将这两个命令放在同一个shell进程中,但此时你需要问问自己通过向Perl解释器添加一个Perl解释器获得了什么。混合。

答案 1 :(得分:2)

您需要做的是写

#!/usr/bin/perl 

#SBATCH -A 1234
#SBATCH -t 2-00:00
#SBATCH -n 24

use strict;
use warnings;
use diagnostics;

system ("module add xxx && srun resp.com ");

然后用

提交
sbatch my_perl_script.pl

#SBATCH行是注定要由sbatch命令解析的注释。它们必须是提交脚本中的注释。

module命令修改了环境,但如果您自己使用system调用该环境,则该环境会立即丢失,因为system会创建子shell。您需要在与srun相同的子shell中调用它,如上所示,或者使用Perl工具在Perl脚本的环境中加载模块,以便srun可以使用{ {1}}如其他地方所述。