我有以下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 ");
答案 0 :(得分:3)
每个system
调用都会创建一个子进程来运行有问题的程序,并在子进程终止时返回。
module
的重点是配置当前shell,其中包括修改它的环境。当这个过程完成(死亡)时,告别那些变化。对srun
的呼唤,在其新的过程中焕然一新,并且没有机会。
前进的步骤:
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}}如其他地方所述。