我想通过使用" 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它会在输出文件中打印输入文件的内容。看起来它在输入中没有任何作用
答案 0 :(得分:2)
以这种方式提交工作会更容易:
echo "perl /absolute/path/to/Test.pl -i FILE_CONFIG.txt" | qsub -l nodes=node06
然后,只要您知道Test.pl位于您在node06上指定的路径中,它就可以正常工作。
答案 1 :(得分:0)
qsub
command不允许将命令行参数直接传递给输入脚本。有两种基本方法:
编写一个包装脚本,使用适当的参数调用您的实际脚本。您甚至可以将标签输入上的包装器脚本传递给qsub
,如dbeer's answer所示,方法是将qsub
命令中的脚本名称指定为“-
”或省略它完全是。
请注意,如果执行此操作,则必须在包装器脚本中指定任何嵌入式#PBS
指令,而不是在包装器调用的内部脚本中指定。当然,如果您没有使用该特定功能,那么您无需担心它。
通过环境传递参数,使用-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 ...