提交网格作业时,如何控制使用的PERL版本?
-
04-10-2019 - |
题
我正在与SGE(Sun Grid Engine)合作,将工作提交给网格。我也使用 perlbrew
管理我已安装的perl版本。我写了一些简短 sh
我用来运行需要特定perl版本(5.12.2)的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)使脚本运行?
解决方案
我不建议把 perlbrew switch perl-5.12.2
在您运行的任何脚本中。它实际上仅用于命令行的使用。
如果您需要脚本来使用特定版本的Perl,请给它完整 perlbrew
Shebang的路径:
#!/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
或者,或者在脚本中使用完整的PATHNAME到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
设置,这可能成为安全风险。最后一个也不好,因为它依赖于什么 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
希望一切都有意义吗?
其他提示
我建议不要使用Perlbrew。它并没有真正带给您那么多的价值,并且只是对您使用的Perl感到困惑。 Perlbrew确实假设同时运行的所有内容都同意他们应该使用哪个Perl。我认为这只是头痛的秘诀,因为不同的程序开始从您的下面切换Perls,也许在您有机会使用您认为切换到的Perl之前。
只需安装所需的perl,然后调用所需的perl。
$ perl5.12.2 /home/dave/scripts/proc_12.pl ...
例如,要安装刚从源树运行的PERL(带有所需的前缀):
$ ./Configure -des -Dprefix=/usr/local/perls/perl-5.12.2
$ make install
然后,我与我的所有安装perls symlink一起链接 make_links 脚本。当我想使用Perl 5.12.2时,我只使用〜/bin/perl5.12.2。我永远不必切换perls。当我要安装PERL模块时,我会使用CPAN:
cpan5.12.2 Some::Module
我永远不确定我正在使用的版本,并且在移动Symlinks周围没有种族条件。