我有以下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
复制相似问题