2010-09-23 39 views
4

我正在與SGE(Sun Grid Engine)合作將作業提交給網格。我也使用perlbrew來管理我安裝的Perl版本。 我寫了一些短期sh腳本,我用它來運行它需要特定的Perl版本(5.12.2)一個Perl腳本,它看起來是這樣的:如何控制提交網格作業時使用的Perl版本?

#!/bin/bash 
#$-S /bin/bash 

source /home/dave/.bash_profile 
/home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2 

/home/dave/scripts/proc_12.pl --in=/home/dave/in/in.store --dir=/home/dave/in/dir2 --params=/home/dave/in/params.p 

現在,當我提出一個工作一切正常很好,但是當我提出很多,我開始變得perlbrew相關的錯誤信息,如:

ln: creating symbolic link `current' to `perl-5.12.2': File exists 
ln: creating symbolic link `/home/dave/perl5/perlbrew/bin/cpan' to `/home/dave/perl5/perlbrew/perls/current/bin/cpan': File exists 
ln: creating symbolic link `/home/dave/perl5/perlbrew/bin/cpan2dist' to `/home/dave/perl5/perlbrew/perls/current/bin/cpan2dist': File exists 
ln: cannot remove `/home/dave/perl5/perlbrew/bin/cpanp': No such file or directory 
ln: cannot remove `/home/dave/perl5/perlbrew/bin/enc2xs': No such file or directory 
ln: cannot remove `/home/dave/perl5/perlbrew/bin/find2perl': No such file or directory 

所以我想/home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2線引起的問題。

我該怎麼辦?

如何讓我的腳本使用perl-5.12.2運行(默認爲5.8.8)?

+0

除了「不爲這個使用perlbrew」回答別人有,這看起來確實有點像,可以與鎖定的perlbrew過程中需要解決的問題?因爲這是一個集羣,你可能對File::SharedNFSLock感興趣。警告:我寫了。 – tsee 2010-09-23 14:56:00

回答

2

我不建議將perlbrew switch perl-5.12.2放在您運行的任何腳本中。它僅限於命令行使用。

如果你需要一個腳本使用Perl的一個特定的版本,那麼要麼放棄它的家當全perlbrew路徑:

#!/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl 

use 5.012; 
use warnings; 
... 

然後確保它的可執行文件並運行,像這樣:

chmod +x your_perl_program.pl 
./your_perl_program.pl 

或可選擇地使用全路徑名的perl程序在你的腳本:

#!/bin/bash 

/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl your_perl_program.pl 


順便說一句,如果你在你的腳本或perl程序中運行任何不合格的東西,你將會有潛在的生產和安全問題。對於如:

#!/bin/sh 

# security risk 
perl some_script.pl 

# and not just perl 
tar cvf archive.tar *.txt 

# production risk 
/home/dave/perl5/perlbrew/bin/perl some_other_script.pl 

前兩個是不好的,因爲它會拿起第一perl & tar發現在你的路徑。所以這取決於$PATH的設置,這可能會成爲安全風險。最後一個也不好,因爲它依賴perl perlbrew目前在其運行時切換到的點:(

所以這樣做可能是一個潛在的生產&安全噩夢,而應該像這樣寫:

#!/bin/sh 

# fully qualified now. Uses OS provided perl 
/usr/bin/perl some_script.pl 

# ditto 
/usr/bin/tar cvf archive.tar *.txt 

# this needs to run in perl 5.12.2 
/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl some_other_script.pl 

希望所有有道理

+0

請參閱我的回覆brian:http://stackoverflow.com/questions/3776390/how-can-i-control-the-perl-version-used-when-submitting-grid-jobs/3776474#3776474。也就是說,在這個腳本中調用的腳本是否也會使用相同的perl版本或訴諸默認? – 2010-09-23 08:31:18

+0

如果你像上面解釋的那樣使用你使用的每個腳本,那麼一切都會好的。如果你不這樣做,它會打開一堆蠕蟲! (請參閱我的BTW)。 – draegtun 2010-09-23 08:42:57

+0

好的。所以當我從perl中調用一個腳本時,我還需要明確地選擇我希望使用的perl(即'system($ my_perl,$ my_script,@ args)',對嗎? – 2010-09-23 08:46:15

4

我建議不要使用perlbrew。它並沒有給你帶來太多的價值,它只會導致你正在使用的perl的混淆。 perlbrew真的假設同時運行的所有東西都同意應該使用哪個perl。我認爲這只是一個令人頭疼的祕訣,因爲不同的程序開始將perls從你的下面切換出來,也許在你有機會使用你認爲你轉換到的perl之前。

只需安裝你想要的perls並調用你想要的。

$ perl5.12.2 /home/dave/scripts/proc_12.pl ... 

例如,安裝一個perl,你剛剛從源代碼樹運行(與取其字首你想):

$ ./Configure -des -Dprefix=/usr/local/perls/perl-5.12.2 
$ make install 

我那麼做符號鏈接到我的所有已安裝的皮爾斯與我make_links腳本。當我想使用Perl 5.12.2時,我只使用〜/ bin/perl5.12.2。我從來不需要切換perls。當我想安裝一個Perl模塊,我使用CPAN吧:

cpan5.12.2 Some::Module 

我從來不確定我使用的是什麼版本,並有一個在中移動的符號鏈接的競爭狀態。

+1

謝謝布萊恩。我知道開始明白爲什麼你對'perlbrew'沒有任何反應,但仍然認爲最好不要使用它。我會認爲我會放棄它,因爲它會導致更多的開銷帶來好處。假設我現在使用類似'〜/ bin/perl5.12.2'的方式來調用我的perl腳本,並且假設perl腳本本身調用其他perl腳本(不是我的),只需使用例如' 'system'。那些其他腳本也會在5.12.2下運行嗎?另外,使用顯式perl bin調用腳本是否會覆蓋腳本中的Shebang行? – 2010-09-23 08:21:56

+1

如果您想運行相同的perl,請在您的腳本中使用$^X變量。見perlvar。 – 2010-09-23 16:08:14

+0

+1謝謝布萊恩! – 2010-09-23 21:44:45