6

SGE(Sun Grid Engine)を使用して、グリッドにジョブを送信しています。perlbrewまた、インストールしたPerlバージョンの管理にも使用します。特定のPerlバージョン(5.12.2)を必要とするperlスクリプトを実行するために使用するいくつかの短いshスクリプトを作成しました。これは次のようになります。

#!/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

これで、1つのジョブを送信するとすべてが正常に機能しますが、多数を送信すると、次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)を使用してスクリプトを実行するにはどうすればよいですか?

4

2 に答える 2

4

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つは、最初の2つを取得し、パスで検出されるため、問題がありperlます。tarしたがって、これは設定に依存し$PATH、セキュリティ上のリスクになる可能性があります。perlbrew最後のものも、実行時に現在どのperlに切り替えられているかに依存しているため、良くありません:(

したがって、これを行うことは、潜在的な生産とセキュリティの悪夢になる可能性があります。代わりに、上記は次のように書く必要があります。

#!/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

すべてが理にかなっていることを願っていますか?

于 2010-09-23T08:26:14.680 に答える
4

perlbrewの使用はお勧めしません。それは実際にはそれほど多くの価値をあなたに与えません、そしてそれはあなたがどんなperlを使っているかについて混乱を引き起こすだけです。perlbrewは、同時に実行されているすべてのものが、どのperlを使用するかについて合意していることを実際に想定しています。さまざまなプログラムがあなたの下からperlを切り替え始めるので、おそらくあなたが切り替えたと思う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

次に、 make_linksスクリプトを使用して、インストールされているすべてのperlへのシンボリックリンクを作成します。Perl 5.12.2を使用したい場合は、〜/ bin/perl5.12.2を使用します。perlsを切り替える必要はありません。Perlモジュールをインストールしたいときは、cpanを使用します。

 cpan5.12.2 Some::Module

使用しているバージョンがわからないことはなく、シンボリックリンクを移動する際の競合状態もありません。

于 2010-09-23T08:15:29.847 に答える