首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将提交SLURM作业的脚本从Bash转换为Perl?

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

Stack Overflow用户
提问于 2015-02-17 17:54:59
回答 2查看 1.1K关注 0票数 0

我有以下Bash脚本,用于将作业提交给集群上的斯隆

代码语言:javascript
运行
复制
#!/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 gaussian,其中gaussian是一个计算量子化学程序)。

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

我尝试将Bash脚本转换为下面的Perl脚本,但是它没有工作。我如何在Perl中做到这一点?

代码语言:javascript
运行
复制
#!/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 ");
EN

回答 2

Stack Overflow用户

发布于 2015-02-17 20:57:36

每个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解释器可以得到什么。
票数 3
EN

Stack Overflow用户

发布于 2015-03-24 09:31:16

你需要做的就是写

代码语言:javascript
运行
复制
#!/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 ");

然后提交给

代码语言:javascript
运行
复制
sbatch my_perl_script.pl

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

module命令修改环境,但是如果在system创建子subshell时使用system调用该环境,则该环境一被调用就会丢失。您需要在与srun相同的子subshell上调用它,如上面所示,或者使用Perl工具在Perl脚本的环境中加载模块,以便srun可以使用其他地方提到的use Env::Modulecmd { load => 'foo/1.0' };

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28567897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档