Comment puis-je contrôler la version Perl utilisée lors de la présentation de la grille des emplois?

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

Question

Je travaille avec SGE (Sun Grid Engine) pour soumettre des travaux à une grille. Je l'utilise aussi perlbrew pour gérer mes versions Perl installés. J'ai écrit quelques scripts sh courts que j'utiliser pour exécuter un script perl qui nécessite une version Perl spécifique (5.12.2), qui ressemble à quelque chose comme ceci:

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

Maintenant, lorsque je soumets un tout seul travail fonctionne très bien, mais quand je soumets beaucoup, je commence à recevoir des messages d'erreur liés à perlbrew, comme:

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

Je suppose que la ligne /home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2 est à l'origine des problèmes.

Que puis-je faire?

Comment puis-je faire mon run script en Perl-5.12.2 (la valeur par défaut est 5.8.8)?

Était-ce utile?

La solution

Je ne recommande pas de mettre le perlbrew switch perl-5.12.2 dans un script que vous exécutez. Son vraiment que pour l'utilisation de la ligne de commande.

Si vous avez besoin d'un script pour utiliser une version spécifique de Perl alors soit donner le chemin de perlbrew complet sur le tralala:

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

use 5.012;
use warnings;
...

faire alors que son exécutable et exécuter comme ceci:

chmod +x your_perl_program.pl
./your_perl_program.pl

Ou bien utiliser le chemin complet vers le binaire perl dans votre script:

#!/bin/bash

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


BTW, vous aurez des problèmes de production et de sécurité potentiels si vous avez quoi que ce soit non qualifié dans vos scripts ou des programmes Perl. Par exemple:

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

Les deux premiers sont mauvais parce qu'il va prendre le premier perl et tar il trouve dans votre chemin. Donc, cela dépend du réglage de $PATH et cela pourrait devenir un risque pour la sécurité. Le dernier est pas bon parce que son dépend de ce que perl perlbrew est actuellement en marche au point dans le temps de sa course: (

faire donc cela peut être une production potentielle et la sécurité cauchemar. Au lieu de cela ci-dessus devrait être écrit comme ceci:

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

L'espoir que tous les sens?

Autres conseils

Je vous recommande de ne pas utiliser perlbrew. Il ne vous donne pas vraiment beaucoup de valeur et il provoque simplement une confusion sur ce que vous utilisez Perl. perlbrew suppose vraiment que tout fonctionne en même temps d'accord sur lequel ils doivent utiliser perl. Je pense que c'est juste une recette pour des maux de tête que les différents programmes commencent à passer Perls de sous vous, peut-être avant de vous la chance même d'utiliser le Perl vous pensez que vous avez changé à.

Il suffit d'installer les Perls que vous voulez et appeler celui que vous voulez.

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

Par exemple, pour installer un perl que vous venez d'exécuter à partir de l'arbre source (avec le préfixe selon que vous voulez):

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

Je puis faire des liens symboliques à tous mes Perls installés avec mon script make_links . Quand je veux utiliser Perl 5.12.2, je viens d'utiliser ~ / bin / perl5.12.2. Je ne dois changer Perls. Quand je veux installer un module Perl, j'utilise le CPAN pour elle:

 cpan5.12.2 Some::Module

Je n'ai jamais sûr de ce que la version que je utilise, et il n'y a aucune condition de course en mouvement autour des liens symboliques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top