Comment puis-je contrôler la version Perl utilisée lors de la présentation de la grille des emplois?
-
04-10-2019 - |
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)?
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.