gpt4 book ai didi

perl - 如何控制提交网格作业时使用的 Perl 版本?

转载 作者:行者123 更新时间:2023-11-29 09:04:26 35 4
gpt4 key购买 nike

我正在使用 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 开关 perl-5.12.2 放在您运行的任何脚本中。它实际上仅供命令行使用。

如果您需要一个脚本来使用特定版本的 Perl,那么要么在 shebang 上给它完整的 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

前两个不好,因为它会选择它在您的路径中找到的第一个 perltar。所以这取决于 $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

希望一切都有意义?

关于perl - 如何控制提交网格作业时使用的 Perl 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776390/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com