2010-09-23 5 views
4

Я работаю с SGE (Sun Grid Engine), чтобы отправить задания в сетку. Я также использую perlbrew для управления моими установленными версиями Perl. я написал несколько коротких sh сценариев, которые я использую, чтобы запустить скрипт на языке Perl, который требует определенной версии 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)?

+0

Помимо «не использовать perlbrew для этого» ответить другие, это действительно выглядит немного как вопрос, который можно решить с блокировкой во время perlbrew? Поскольку это находится в кластере, вас может заинтересовать File::SharedNFSLock. Предостережение: Я написал его. – tsee

ответ

2

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

Надежда, что все имеет смысл

+0

Пожалуйста, см. Мой ответ brian: http://stackoverflow.com/questions/3776390/how-can-i-control-the-perl-version-used-when-submitting-grid-jobs/3776474#3776474. А именно, скрипты, вызываемые внутри этого скрипта, также будут использовать одну и ту же версию perl или прибегнуть к умолчанию? –

+0

Если вы квалифицируете каждый сценарий, который используете, как я объяснил выше, все будет в порядке. если вы этого не сделаете, это откроет банку червей! (см. мое BTW). – draegtun

+0

ОК. Поэтому, когда я вызываю скрипт изнутри perl, мне также нужно явно выбрать perl, который я хочу использовать (т.е. 'system ($ my_perl, $ my_script, @ args)', правильно? –

4

Я бы порекомендовал против использования perlbrew. Это не дает вам такой большой ценности, и это просто вызывает путаницу в отношении того, что вы используете. perlbrew действительно предполагает, что все работает в то же время соглашается с тем, какой 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 5.12.2, я просто использую ~/bin/perl5.12.2. Мне никогда не нужно переключаться. Когда я хочу установить модуль Perl, я использую CPAN для этого:

cpan5.12.2 Some::Module 

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

+1

Спасибо, Брайан. Я знаю, что начинаю понимать, почему у вас нет ничего против «perlbrew», но все же думает, что лучше не использовать его. Я подумаю, что я убью его, поскольку это наносит дополнительный урон преимуществам. Поэтому предположим, что теперь я буду называть мои скрипты perl, используя что-то вроде '~/bin/perl5.12.2', и предположим, что сам скрипт perl вызывает некоторые другие скрипты perl (не мои), просто вызывая их, используя, например, 'System'. Будут ли эти другие сценарии работать под 5.12.2 тоже? Кроме того, вызывает ли сценарий использование явного perl bin переопределяет строку Shebang в скрипте? –

+1

Если вы хотите запустить тот же perl, используйте переменную $^X внутри вашего скрипта. См. Perlvar. –

+0

+1 Спасибо, Брайан! –

 Смежные вопросы

  • Нет связанных вопросов^_^