2013-03-28 96 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}