Pregunta

Estoy trabajando con SGE (Sun Grid Engine) para enviar trabajos a una rejilla. También uso perlbrew para gestionar mis versiones de Perl instalados. He escrito algunos guiones cortos sh que utilizo para ejecutar un script en perl que requiere una versión específica de Perl (5.12.2), que ser algo como esto:

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

Ahora, cuando presente un solo trabajo todo funciona bien, pero cuando me presento muchos, comienza a recibir mensajes de error relacionados con perlbrew, como:

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

Así que supongo que la línea /home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2 está causando los problemas.

¿Qué puedo hacer?

¿Cómo puedo hacer que mi carrera script utilizando Perl 5.12.2-(el valor predeterminado es 5.8.8)?

¿Fue útil?

Solución

No recomiendo poner el perlbrew switch perl-5.12.2 en cualquier secuencia de comandos se ejecuta. Su realmente sólo para el uso de línea de comandos.

Si necesita una secuencia de comandos para utilizar una versión específica de Perl entonces o bien darle la trayectoria perlbrew completo en el tinglado:

#!/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl

use 5.012;
use warnings;
...

A continuación, asegúrese de que su ejecutable y ejecutar de esta manera:

chmod +x your_perl_program.pl
./your_perl_program.pl

O, alternativamente, utilizar la ruta completa al binario Perl en el script:

#!/bin/bash

/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl your_perl_program.pl


Por cierto, tendrá potenciales problemas de producción y de seguridad si se ejecuta nada sin reservas en los scripts de Perl o programas. Para, por ejemplo:

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

Los dos primeros son malas porque va a recoger el primer perl y tar que encuentre en su camino. Así que esto depende del ajuste $PATH y esto podría convertirse en un riesgo para la seguridad. El último tampoco es bueno, porque su dependen de lo que Perl perlbrew se conecta actualmente a en el punto en el tiempo su funcionamiento: (

Así que haciendo esto puede ser una producción potencial de seguridad y pesadilla. En lugar de lo anterior debe escribirse así:

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

La esperanza de que todo tiene sentido?

Otros consejos

lo recomiendo contra el uso de perlbrew. En realidad, no le dan mucho valor y que sólo causa confusión acerca de lo que Perl está utilizando. perlbrew realmente supone que todo funcionando al mismo tiempo, está de acuerdo en el que perl que deben utilizar. Creo que eso es sólo una receta para el dolor de cabeza como los diferentes programas se inician el cambio perlas de debajo de ti, tal vez antes de llegar a la posibilidad incluso de utilizar el Perl cree que cambiara a.

Sólo tiene que instalar las perlas que desee y llame a la que desea.

 $ perl5.12.2 /home/dave/scripts/proc_12.pl ...

Por ejemplo, para instalar un Perl que acaba de ejecutar desde el árbol de código fuente (con cualquier prefijo que desea):

 $ ./Configure -des -Dprefix=/usr/local/perls/perl-5.12.2
 $ make install

a continuación, hacer enlaces simbólicos a todos mis perlas instalado mi make_links guión. Cuando quiero usar Perl 5.12.2, sólo tiene que utilizar ~ / bin / perl5.12.2. Nunca tiene que cambiar Perls. Cuando quiero instalar un módulo de Perl, yo uso el CPAN para ello:

 cpan5.12.2 Some::Module

Nunca me he seguro acerca de cuál es la versión que estoy usando, y no hay ninguna condición de carrera en el movimiento alrededor de los enlaces simbólicos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top