我有以下Bash脚本,用于将作业提交给集群上的斯隆:
#!/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中做到这一点?
#!/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 ");
发布于 2015-02-17 20:57:36
每个system
调用都会创建一个子进程来运行该程序,并在子进程死亡时返回。
module
的全部目的是通过修改当前shell的环境来配置它。当这个过程完成(死亡)时,对这些变化说再见。对srun
的调用,在它的新过程中,有着一个闪亮的新环境,却没有机会。
向前迈出的步骤:
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-03-24 09:31:16
你需要做的就是写
#!/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
创建子subshell时使用system
调用该环境,则该环境一被调用就会丢失。您需要在与srun
相同的子subshell上调用它,如上面所示,或者使用Perl工具在Perl脚本的环境中加载模块,以便srun
可以使用其他地方提到的use Env::Modulecmd { load => 'foo/1.0' };
。
https://stackoverflow.com/questions/28567897
复制相似问题