0

我有以下 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加载环境模块 xxx(在这种情况下,我实际使用module add gaussiangaussian是计算量子化学程序)。

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 ");
4

2 回答 2

3

您的每个system调用都会创建一个子进程来运行相关程序,并在子进程死亡时返回。

重点module是通过修改它的环境来配置当前的 shell。当这个过程完成(死亡)时,就告别这些变化。对 的调用srun,在它的新流程和新环境中,没有机会。

前进的步骤:

  • 了解SLURM 和 bash 以及为什么system("#SBATCH whatever");可能没有任何价值。提示:#标记 Bash 和 Perl 中注释的开始。
  • 了解module add正在做什么xxx以及如何在 Perl 解释器的 shell 中复制它正在执行的操作。ThisSuitIsBlackNot 建议use Env::Modulecmd { load => 'foo/1.0' };复制此功能。
  • 除非对 , 有任何理解,否则module add会将system ('module add xxx; srun resp.com')这两个命令放在同一个 shell 进程中,但此时您需要问自己,通过添加 Perl 解释器获得了什么。
于 2015-02-17T20:57:36.107 回答
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命令会修改环境,但是如果您单独调用它,则该环境会在调用它时立即丢失,因为它systemsystem创建一个子shell。您需要在与 相同的子shell 上调用它srun,如上所示,或者使用 Perl 工具将模块加载到 Perl 脚本的环境中,以便它可用于srunuse Env::Modulecmd { load => 'foo/1.0' };如其他地方所述使用。

于 2015-03-24T09:31:16.757 回答