グリッドジョブを送信するときに使用されるPERLバージョンを制御するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3776390

質問

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

私が使用しているバージョンについて確信が持てず、シンリンクを動かすことに人種の状態はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top