如何在perl脚本中使用PBS扭矩中的qsub -v命令?

时间:2013-03-25 17:09:15

标签: perl pbs qsub torque

我想通过使用" qsub -v"将变量传递给perl脚本。命令。 这是我要运行的perl脚本(它只是一个测试,但如果它没有工作,我就不能做任何更难的事情)

#!/usr/bin/perl
use Getopt::Long;
$result = GetOptions ("i=s" => \$config_file);

open(FILE,">/data/home/FILEout.txt");
open(FILE_CONFIG,"<$config_file");
while(<FILE_CONFIG>){
  print FILE "$config_file\n";
}
close(FILE_CONFIG);
close(FILE);

所以,如果我要运行这个脚本(而不是通过qsub),我会输入:

perl Test.pl -i FILE_CONFIG.txt

但是,我会在与pbs一起使用的集群的节点上运行此脚本。 我做了几次尝试,如下所示:

qsub -l nodes=node06 -v i=/data/home/FILE_CONFIG.txt Test.pl 

但它不起作用。 任何人都知道如何使用qsub将参数传递给我的perl脚本? 任何帮助都会非常感激

不起作用意味着使用qsub不会在输出文件上打印任何内容,而只使用perl它会在输出文件中打印输入文件的内容。看起来它在输入中没有任何作用

2 个答案:

答案 0 :(得分:2)

以这种方式提交工作会更容易:

echo "perl /absolute/path/to/Test.pl -i FILE_CONFIG.txt" | qsub -l nodes=node06

然后,只要您知道Test.pl位于您在node06上指定的路径中,它就可以正常工作。

答案 1 :(得分:0)

qsub command不允许将命令行参数直接传递给输入脚本。有两种基本方法:

  1. 编写一个包装脚本,使用适当的参数调用您的实际脚本。您甚至可以将标签输入上的包装器脚本传递给qsub,如dbeer's answer所示,方法是将qsub命令中的脚本名称指定为“-”或省略它完全是。

    请注意,如果执行此操作,则必须在包装器脚本中指定任何嵌入式#PBS指令,而不是在包装器调用的内部脚本中指定。当然,如果您没有使用该特定功能,那么您无需担心它。

  2. 通过环境传递参数,使用-v切换到qsub。也就是说,如果您的qsub命令如下所示:

    qsub -l nodes=node06 -v CONFIG=/data/home/FILE_CONFIG.txt Test.pl 
    

    然后您的Test.pl脚本可以从$ENV{CONFIG}读取配置文件路径,如下所示:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my $config = $ENV{CONFIG} || 'default_config_file_path.txt';
    open CONFIG, '<', $config  or die "Error opening $config: $!\n";
    
    # ... rest of script here ...