2013-03-28 66 views
0

嗨想要传递一个参数给我的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脚本的输出文件总是空的。

你有什么建议吗?我错在哪里?请帮助

+0

这个'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

+0

@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

+0

and @ARGV is empty – desmo 2013-03-28 13:36:46

回答

1

根据所有文档,我可以找到-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; 
+0

感谢您的帮助。我正在使用PBRProfessional 10.4。它不支持'qsub ... Test.pl -i = 500',你怎么建议-v设置一个环境变量。所以我改变了我的脚本,并添加了'use Env;打印文件“$ ENV {i}”;'但没有任何改变。你知道为什么吗? Thans再次 – desmo 2013-03-28 12:03:08

+0

@desmo,不,我只有文档可以通过,我发现的所有文档都显示'-v'设置环境变量。 (请注意'use Env;'在这里没有任何用处。)我为我的答案添加了一个替代解决方案(使用助手脚本),但它也假设'-v'设置了环境变量。 – ikegami 2013-03-28 12:08:26

0

我终于得到了与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}