将参数传递给perl脚本执行槽qsub
嗨想要传递一个参数给我的perl脚本,应该通过qsub执行。 于是我运行:将参数传递给perl脚本执行槽qsub
qsub -l nodes=node01 -v "i=500" Test.pl
虽然Test.pl我试着打电话给我分几路参数:
use Getopt::Long;
$result = GetOptions ("i" => \$num);
open(FILE,">/data/home/FILEout.txt");
print FILE "$num\n";
print FILE "$ARGV[0]";
close(FILE);
可惜的是Perl脚本的输出文件总是空的。
你有什么建议吗?我错在哪里?请帮助
根据所有文档,我可以找到-v
设置一个环境var,所以你会使用$ENV{i}
得到500
。 (检查自己的文档进行确认。)
如果你想真正的ARG传递给你的脚本,你可以尝试使用
qsub ... Test.pl -i=500
但基于我的网络搜索,这可能只是工作对于某些版本的qsub
。其他人会要求你做一个辅助脚本(说Test.sh
)
#!/bin/sh
Test.pl "-i=$i"
与命令一起
qsub ... -v 'i=500' Test.sh
如果qsub ... Test.pl ...args...
支持,你可以改变你的脚本,最简单的解决方法是
qsub ... Test.pl 500
and
my ($i) = @ARGV;
感谢您的帮助。我正在使用PBRProfessional 10.4。它不支持'qsub ... Test.pl -i = 500',你怎么建议-v设置一个环境变量。所以我改变了我的脚本,并添加了'use Env;打印文件“$ ENV {i}”;'但没有任何改变。你知道为什么吗? Thans再次 – desmo 2013-03-28 12:03:08
@desmo,不,我只有文档可以通过,我发现的所有文档都显示'-v'设置环境变量。 (请注意'use Env;'在这里没有任何用处。)我为我的答案添加了一个替代解决方案(使用助手脚本),但它也假设'-v'设置了环境变量。 – ikegami 2013-03-28 12:08:26
我终于得到了与PBRProfessional 10.4一起使用的解决方案。
有两种方式来解决这个问题:
第一个是以下
echo "perl /path/to/Test.pl -i 500" | qsub -l nodes=node06
第二个是两个用
qsub -l nodes=node06 -v i=500 Test.pl
,并通过阅读在Test.pl参数$ ENV {i}
这个'Test.pl'的输出是什么:'use Data :: Dumper;打开($ FH,“>/data/home/FILEout.txt”)或者死掉$ !;本地$ Data :: Dumper :: Terse = 1;本地$ Data :: Dumper :: Indent = 0; print($ FH Dumper(\ @ ARGV),“\ n”); print($ FH join(',',keys(%ENV)),“\ n”);'? – ikegami 2013-03-28 12:13:53
@ikegami我真的很感谢你的帮助。 Test.pl的输出如下:'PBS_NODEFILE,PBS_O_SHELL,PBS_O_SYSTEM,SSH_ASKPASS,PBS_O_WORKDIR,PBS_O_LANG,PBS_O_MAIL,PBS_O_PATH,LESSOPEN,PBS_JOBCOOKIE,PWD,LANG,USER,PBS_O_HOST,G_BROKEN_FILENAMES,LOGNAME,PBS_JOBID,SHLVL,INPUTRC, PATH,PBS_ENVIRONMENT,PBS_O_QUEUE,OMP_NUM_THREADS,PBS_QUEUE,HISTSIZE,PBS_O_HOME,PBS_MOMPORT,HOME,MAIL,PBS_O_LOGNAME,TZ,PBS_NODENUM,PBS_TASKNUM,NCPUS,HOSTNAME,_,LS_COLORS,SHELL,PBS_JOBNAME,PBS_JOBDIR,TMPDIR, qsub -l nodes = node01 -v“i = 500”Test.pl' – desmo 2013-03-28 13:26:32
and @ARGV is empty – desmo 2013-03-28 13:36:46