2010-09-23 38 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