Frage

Ich arbeite mit SGE (Sun Grid Engine) Jobs zu einem Raster zu unterbreiten. Ich benutze perlbrew auch meine installierten Perl-Versionen zu verwalten. Ich schrieb einig kurzen sh Skripte, dass ich einen Perl-Skript ausgeführt werden soll, die eine bestimmte Perl-Version benötigt (5.12.2), die in etwa so aussehen:

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

Nun, wenn ich einen einzigen Job übergeben alles funktioniert gut, aber wenn ich viele einreichen, beginne ich perlbrew bezogene Fehlermeldungen bekommen, wie:

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

Also habe ich die /home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2 Linie erraten verursacht die Probleme.

Was kann ich tun?

Wie kann ich mein Skript läuft mit perl-5.12.2 machen (die Standardeinstellung ist 5.8.8)?

War es hilfreich?

Lösung

Ich empfehle, nicht den perlbrew switch perl-5.12.2 in jedem Skript setzen Sie laufen. Es ist wirklich nur für die Kommandozeilennutzung.

Wenn Sie ein Skript benötigen entweder eine bestimmte Version von Perl zu verwenden, dann geben sie den vollen perlbrew Pfad auf dem shebang:

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

use 5.012;
use warnings;
...

Dann stellen Sie sicher sein ausführbare und laufen wie folgt:

chmod +x your_perl_program.pl
./your_perl_program.pl

Nutzen Sie alternativ den vollständigen Pfad zu dem Perl-Binary im Skript:

#!/bin/bash

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


BTW, werden Sie potenzielle Produktion und Sicherheitsprobleme haben, wenn Sie etwas unqualifiziert in Ihre Skripte oder Perl-Programme ausführen. Für zB:

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

Die ersten beiden sind schlecht, weil es die erste perl abholen & tar es in den Weg findet. So hängt dies von $PATH Einstellung und dies ein Sicherheitsrisiko werden könnte. Die letzte ist auch nicht gut, weil seine angewiesen auf das, was Perl perlbrew derzeit geschaltet zu dem Zeitpunkt seinen Lauf: (

So Dadurch kann eine mögliche Produktion und Sicherheit Alptraum. Stattdessen sollte die obige wie folgt geschrieben werden:

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

Hoffnung, dass alles einen Sinn?

Andere Tipps

Ich würde empfehlen, gegen perlbrew verwenden. Es ist nicht wirklich geben Sie so viel Wert und es verursacht nur Verwirrung darüber, was Perl Sie verwenden. perlbrew geht davon aus, dass wirklich alles zur gleichen Zeit ausgeführt wird, auf dem Perl stimmt sollten sie nutzen. Ich denke, das ist nur ein Rezept für Kopfschmerzen als andere Programme starten perls aus unter Ihnen wechseln, vielleicht, bevor Sie die Chance bekommen, auch das Perl benutzen Sie denken, Sie geschaltet.

Installieren Sie einfach die perls, dass Sie wünschen und das man das so nennen, die Sie wollen.

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

Zum Beispiel ein Perl installieren Sie gerade aus dem Quellbaum laufen (mit welcher auch immer Präfix Sie mögen):

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

Ich mache Symlinks dann auf alle meine installierten perls mit meinem make_links Skript. Wenn ich 5.12.2 Perl verwenden möchten, benutze ich nur ~ / bin / perl5.12.2. Ich habe nie perls zu wechseln. Wenn ich ein Perl-Modul installieren möchten, verwende ich die cpan für sie:

 cpan5.12.2 Some::Module

habe ich nie unsicher, was Version ich verwende, und es gibt keine Race-Bedingung Symlinks um in zu bewegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top