Domanda

Sto lavorando con SGE (Sun Grid Engine) per inviare i lavori ad una griglia. Io uso anche perlbrew per gestire le mie versioni di Perl installati. Ho scritto alcuni script sh brevi che uso per eseguire uno script perl che richiede una specifica versione di Perl (5.12.2), che aspetto simile a questo:

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

Ora, quando presento un singolo lavoro tutto funziona bene, ma quando presento molti, ho iniziare a ricevere i messaggi di errore relativi perlbrew, come:

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

Quindi credo che la linea /home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2 sta causando i problemi.

Che cosa posso fare?

Come posso fare la mia corsa script utilizzando perl-5.12.2 (il valore predefinito è 5.8.8)?

È stato utile?

Soluzione

Non consiglio mettere il perlbrew switch perl-5.12.2 in qualsiasi script che si esegue. Il suo in realtà solo per l'utilizzo della riga di comando.

Se avete bisogno di uno script per utilizzare una versione specifica di Perl poi o dare il percorso completo perlbrew sulla faccenda:

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

use 5.012;
use warnings;
...

Quindi assicurarsi che il suo eseguibile e gestito in questo modo:

chmod +x your_perl_program.pl
./your_perl_program.pl

, oppure utilizzare il percorso completo al binario perl nello script:

#!/bin/bash

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


A proposito, si avrà potenziali problemi di produzione e di sicurezza se si esegue nulla senza riserve nei vostri script o programmi Perl. Per esempio:

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

I primi due sono male perché prenderà il primo perl & tar che trova nel tuo percorso. Quindi, questo dipende dalla impostazione $PATH e questo potrebbe diventare un rischio per la sicurezza. L'ultimo è anche non va bene perché il suo affidamento su ciò che perl perlbrew è attualmente commutato nel punto nel tempo la sua corsa: (

Così facendo questo può essere una produzione e di sicurezza potenziale incubo. Invece quanto sopra dovrebbe essere scritto in questo modo:

#!/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 speranza che tutto ha un senso?

Altri suggerimenti

mi consiglia di non usare perlbrew. Essa in realtà non ti danno più di tanto valore e provoca solo confusione su ciò che Perl si sta utilizzando. perlbrew davvero presuppone che tutto in esecuzione allo stesso tempo è d'accordo su cui perl dovrebbero usare. Penso che sia solo una ricetta per il mal di testa come diversi programmi iniziano il passaggio Perls da sotto, forse prima di ottenere la possibilità anche di utilizzare il Perl si pensa che si è passati a.

Basta installare le perle che si desidera e chiamare il quello che si desidera.

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

Per esempio, per installare un perl basta eseguire dalla albero dei sorgenti (con qualsiasi prefisso che si desidera):

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

Ho poi fare collegamenti simbolici a tutti i miei Perls installati con la mia make_links script. Quando voglio usare Perl 5.12.2, mi basta usare ~ / bin / perl5.12.2. Non ho mai dovuto cambiare perle. Quando voglio installare un modulo Perl, io uso il CPAN per esso:

 cpan5.12.2 Some::Module

Non ho mai dubbi su quale versione che sto usando, e non c'è condizione di competizione nel muoversi link simbolici intorno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top