グリッドジョブを送信するときに使用される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
シバンのパス:
#!/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
最初の2つは悪いです。 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を使用すべきかに同意すると本当に想定しています。おそらく、あなたが切り替えたと思うPerlを使用する機会を得る前に、異なるプログラムがあなたの下からPerlを切り替え始めるので、それは単なる頭痛のレシピだと思います。
必要なPerlsをインストールして、必要なものを呼び出すだけです。
$ perl5.12.2 /home/dave/scripts/proc_12.pl ...
たとえば、ソースツリーから実行したばかりのPerlをインストールするには(必要なプレフィックスを使用して):
$ ./Configure -des -Dprefix=/usr/local/perls/perl-5.12.2
$ make install
次に、インストールされたすべてのPerlsにSymlinksを作成します make_links 脚本。 Perl 5.12.2を使用したい場合は、〜/bin/perl5.12.2を使用します。 Perlsを切り替える必要はありません。 Perlモジュールをインストールしたい場合は、CPANを使用します。
cpan5.12.2 Some::Module
私が使用しているバージョンについて確信が持てず、シンリンクを動かすことに人種の状態はありません。