Come posso controllare la versione di Perl utilizzata quando si inoltrano processi di rete?
-
04-10-2019 - |
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)?
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.