Как я могу контролировать версию Perl, используемую при отправке сеточных заданий? - PullRequest
5 голосов
/ 23 сентября 2010

Я работаю с SGE (Sun Grid Engine) для отправки заданий в сетку.Я также использую perlbrew для управления моими установленными версиями Perl.Я написал несколько коротких sh сценариев, которые я использую для запуска сценария Perl, для которого требуется определенная версия Perl (5.12.2), которые выглядят примерно так:

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

Ответы [ 2 ]

4 голосов
/ 23 сентября 2010

Я бы рекомендовал не использовать perlbrew.Это на самом деле не дает вам такой большой ценности, а просто вызывает путаницу в том, какой Perl вы используете.Perlbrew действительно предполагает, что все работающие в то же время соглашаются, какой 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

Затемсимволические ссылки на все мои установленные perls с моим make_links сценарием.Когда я хочу использовать Perl 5.12.2, я просто использую ~ / bin / perl5.12.2.Мне никогда не придется переключать Perls.Когда я хочу установить модуль Perl, я использую для него cpan:

 cpan5.12.2 Some::Module

Я никогда не был уверен в том, какую версию я использую, и нет условий гонки при перемещении символических ссылок.

3 голосов
/ 23 сентября 2010

Я не рекомендую ставить 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

Первые два плохие, потому что он подберет первые perl & tar, которые он найдет на вашем пути. Так что это зависит от настройки $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

Надеюсь, что все имеет смысл?

...