1

我想通过使用“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 它会在输出文件中打印输入文件的内容。看起来它不需要任何输入

4

2 回答 2

2

Would it be easier for you to submit the job this way:

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

Then, as long as you know that Test.pl is in the path you specify on node06, it should work correctly.

于 2013-03-28T15:39:13.550 回答
0

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

  1. 编写一个包装脚本,使用适当的参数调用您的实际脚本。您甚至可以通过将命令中的脚本名称指定为“ ”或完全省略它,将包装脚本传递到qsub标准输入,如dbeer 的答案所示。qsub-

    请注意,如果您这样做,则#PBS必须在包装器脚本中指定任何嵌入式指令,而不是在包装器调用的内部脚本中。当然,如果您不使用该特定功能,则无需担心。

  2. 而是通过环境传递参数,使用-vswitch 到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 ...
    
于 2013-03-28T17:02:20.523 回答