• Publicidad

script en crontab no localiza módulos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

script en crontab no localiza módulos

Notapor enric73 » 2013-05-21 15:46 @699

Hola, compañeros.

Tengo un problemilla curioso. Instalé con cpan Image::Grab.

Cuando ejecuto el script .pl manualmente por consola, me descarga la imagen en un directorio local. Si programo este mismo script en el crontab entonces me sale un error de que no encuentra dicha biblioteca o paquete... con el siguiente mensaje:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't locate Image/Grab.pm in @INC (@INC contains: /usr/local/lib/perl5/5.10.1/i686-linux-thread-multi /usr/local/lib/perl5/5.10.1 /usr/local/lib/perl5/site_perl/5.10.1/i686-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.1 .) at /home/enric/download_images.pl line 4.
BEGIN failed--compilation aborted at /home/enric/download_images.pl line 4.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Versión de Perl: This is perl, v5.10.1 (*) built for i686-linux-thread-multi

En la cabecera del script, cargo las siguientes bibliotecas...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Image::Grab qw(grab);
  5. use File::Path;
  6. use File::Copy;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Me podéis aconsejar?

Gracias

¿Alguna idea para solucionarlo?
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Publicidad

Re: script en crontab no localiza módulos

Notapor explorer » 2013-05-21 20:13 @884

Cuando ponemos un programa bajo el crontab, éste se ejecutará con otra personalidad (otro usuario) o con otros permisos o entorno (la variable $PATH, por ejemplo). Entonces, si nuestro programa depende de bibliotecas externas, debe saber cómo llegar a ellas.

Lo primero es saber dónde está instalada el módulo Image::Grab.

Ejecuta:

perl -E 'use Image::Grab; say $INC{"Image/Grab.pm"}'

El resultado es la ruta hacia donde está esa biblioteca. Entonces, solo queda agregarla con un "use lib" a tu programa.

Por ejemplo, si está instalada en

/usr/lib/perl5/site_perl/5.10.1/Image/Grab.pm

entonces debes poner, al principio del programa:

use lib '/usr/lib/perl5/site_perl/5.10.1';

P.D. Es extraño que solo salgan esas rutas en el mensaje de error. Deberían salir más. Prueba a ejecutar perl -V
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script en crontab no localiza módulos

Notapor enric73 » 2013-05-22 03:00 @167

Hola explorer,

Al hacer perl -V, me aparece lo siguiente... Tengo otros módulos instalados y no me dan problema. Hace unas semanas hice un update del Perl.
Código: Seleccionar todo
[enric@localhost ~]$ perl -V
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=2.6.18-348.1.1.el5, archname=i686-linux-thread-multi
    uname='linux localhost.localdomain 2.6.18-348.1.1.el5 #1 smp tue jan 22 16:24:03 est 2013 i686 athlon i386 gnulinux '
    config_args='-de -Dusethreads'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.1.2 20080704 (Red Hat 4.1.2-54)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.5.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.5'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'


Characteristics of this binary (from libperl):
  Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
                        PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP USE_ITHREADS
                        USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API
  Built under linux
  Compiled at May  8 2013 00:21:18
  %ENV:
    PERL5LIB="/home/enric/perl5/lib/perl5:/home/enric/perl5/lib/perl5:"
    PERL_LOCAL_LIB_ROOT=":/home/enric/perl5:/home/enric/perl5"
    PERL_MB_OPT="--install_base /home/enric/perl5"
    PERL_MM_OPT="INSTALL_BASE=/home/enric/perl5"
  @INC:
    /home/enric/perl5/lib/perl5/i686-linux-thread-multi
    /home/enric/perl5/lib/perl5
    /home/enric/perl5/lib/perl5/i686-linux-thread-multi
    /home/enric/perl5/lib/perl5
    /usr/local/lib/perl5/5.10.1/i686-linux-thread-multi
    /usr/local/lib/perl5/5.10.1
    /usr/local/lib/perl5/site_perl/5.10.1/i686-linux-thread-multi
    /usr/local/lib/perl5/site_perl/5.10.1

¿Ves alguna cosa rara?
Saludos,
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: script en crontab no localiza módulos

Notapor explorer » 2013-05-22 10:44 @489

Lo raro son las rutas predefinidas en @INC...

En mi servidor Debian, son estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  @INC:
    /etc/perl
    /usr/local/lib/perl/5.14.2
    /usr/local/share/perl/5.14.2
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.14
    /usr/share/perl/5.14
    /usr/local/lib/site_perl
    .
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Se ven las rutas principales del sistema, además de las local/.

En el ordenador de casa, me sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  @INC:
    /usr/lib/perl5/site_perl/5.16.2/x86_64-linux-thread-multi
    /usr/lib/perl5/site_perl/5.16.2
    /usr/lib/perl5/vendor_perl/5.16.2/x86_64-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.16.2
    /usr/lib/perl5/5.16.2/x86_64-linux-thread-multi
    /usr/lib/perl5/5.16.2
    /usr/lib/perl5/site_perl/5.16.2/x86_64-linux-thread-multi
    /usr/lib/perl5/site_perl/5.16.2
    /usr/lib/perl5/site_perl
    .
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Lo mismo que antes, aparecen todas las rutas del sistema.

En una instalación perlbrew, con el último Perl disponible, sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  @INC:
    /home/explorer/perl5/perlbrew/perls/perl-5.18.0/lib/site_perl/5.18.0/x86_64-linux
    /home/explorer/perl5/perlbrew/perls/perl-5.18.0/lib/site_perl/5.18.0
    /home/explorer/perl5/perlbrew/perls/perl-5.18.0/lib/5.18.0/x86_64-linux
    /home/explorer/perl5/perlbrew/perls/perl-5.18.0/lib/5.18.0
    .
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
que es algo lógico, porque se trata de una instalación local de un usuario.

No nos dices dónde está instalado Image::Grab. Si no está en alguna de las rutas que @INC muestra, deberás decírselo en el programa, con la solución del 'use lib'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script en crontab no localiza módulos

Notapor enric73 » 2013-05-28 15:20 @681

Hola, explorer.

Ahora ya encuentra el módulo, he puesto la dirección en la que se encuentra:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use  lib '/usr/lib/perl5/site_perl/5.8.8';
  2. use Image::Grab qw(grab);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El tema es que actualmente utilizo perl v5.10.1:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [enric@localhost ~]$ perl -v
  2.  
  3. This is perl, v5.10.1 (*) built for i686-linux-thread-multi
  4.  
  5. Copyright 1987-2009, Larry Wall
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La mayoría de los módulos los tengo duplicados en varias carpetas, una para cada versión de Perl, y en local, un lio:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [enric@localhost ~]$ locate Copy.pm
  2. /home/enric/Desktop/perl-5.10.1/lib/File/Copy.pm
  3. /usr/lib/perl5/5.8.8/File/Copy.pm
  4. /usr/local/lib/perl5/5.10.1/File/Copy.pm
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero por defecto entiendo que busca en la carpeta de perl-5.10.1, porque cuando ejecuto perl -v aparece esta versión.

En el caso de Grab.pm...
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [enric@localhost ~]$ locate Grab.pm
  2. /home/enric/perl5/lib/perl5/Image/Grab.pm
  3. /usr/lib/perl5/site_perl/5.8.8/Image/Grab.pm
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y por esta razón he de redireccionarlo...

Si intento instalar de nuevo este paquete con CPAN, en teoría, ¿tendría que instalarlo en el directorio en la nueva versión de perl-5.10-1? Pero no lo hace, dice que ya está pero realmente no... con el root, entro en cpan... install Image::Grab

Os pego la salida de cpan, ¿diría que me está diciendo que ya está instalado?

Código: Seleccionar todo
[root@localhost enric]# cpan

cpan shell -- CPAN exploration and modules installation (v2.00)
Enter 'h' for help.

cpan[1]> install Image::Grab
CPAN: Storable loaded ok (v2.20)
Reading '/root/.cpan/Metadata'
  Database was generated on Tue, 21 May 2013 19:53:02 GMT
CPAN: LWP::UserAgent loaded ok (v6.05)
CPAN: Time::HiRes loaded ok (v1.9719)
Fetching with LWP:
http://www.perl.org/CPAN/authors/01mailrc.txt.gz
CPAN: YAML loaded ok (v0.84)
Reading '/root/.cpan/sources/authors/01mailrc.txt.gz'
CPAN: Compress::Zlib loaded ok (v2.06)
............................................................................DONE
Fetching with LWP:
http://www.perl.org/CPAN/modules/02packages.details.txt.gz
Reading '/root/.cpan/sources/modules/02packages.details.txt.gz'
  Database was generated on Tue, 28 May 2013 20:07:17 GMT
............................................................................DONE
Fetching with LWP:
http://www.perl.org/CPAN/modules/03modlist.data.gz
Reading '/root/.cpan/sources/modules/03modlist.data.gz'
............................................................................DONE
Writing /root/.cpan/Metadata
CPAN: Module::CoreList loaded ok (v2.18)
Image::Grab is up to date (1.4.2).


¿Cómo puedo saber dónde me está instalando ahora el cpan, los módulos?

Gracias por vuestra ayuda... Ahora el script funciona, pero debería aclararme con este tema del cpan.

Saludos
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: script en crontab no localiza módulos

Notapor danimera » 2013-05-28 16:19 @721

Me encontré hace poco que los módulos cPanel tienen algo nuevo para encontrar donde están instalado los módulos:

Usando Su Perl Module(s)

Your Perl script needs to know how to find the modules in your path.
You can do this by adding one of the two choices below to the top of your script:
#!/usr/bin/perl
use cPanelUserConfig;
or

#!/usr/bin/perlml


eso en el caso de cPanel, pero generalmente yo suelo tener un directorio donde están mis módulos y con use lib "mi_ruta" los encuentra sin problemas.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: script en crontab no localiza módulos

Notapor explorer » 2013-05-28 17:14 @759

Por defecto, el cpan instalará los módulos en el directorio site-perl/ del sistema, si ejecutas cpan como root. Si no eres root o no puede escribir en ese directorio, entonces intentará cargar local::lib para intentar instalar los módulos de forma local.

La configuración de cpan se saca con

cpan -J

queda grabada en /root/.cpan/CPAN/MyConfig.pm

Pero ahí no se indica la ruta de instalación.

Esto lo tienes explicado en la pregunta I am not root, how can I install a module in a personal directory? que está en la página de manual de CPAN(3pm) (no la página de manual de cpan).

En ese página hay otra pregunta interesante: "He instalado una nueva versión del módulo X pero CPAN insiste en que ya tengo una versión más antigua instalada". Eso se soluciona agregando UNINST=1 a la lista de opciones de instalación (en el shell de cpan):

o conf make_install_arg UNINST=1
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script en crontab no localiza módulos

Notapor enric73 » 2013-05-29 02:51 @160

Hola, explorer y danimera, gracias,

Utilizo root para instalar módulos. He seguido tu reseña, http://manpages.sgvulcan.com/CPAN.3pm.php

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"The easiest way to prevent this behaviour is to add the argument UNINST=1 to the make install call, and that is why many people add this argument permanently by configuring
o conf make_install_arg UNINST=1"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Entonces, ¿se procede simplemente añadiendo en el shell de cpan "UNINST=1" (luego enter) o "o conf make_install_arg UNINST=1" y después "INSTALL IMAGE::GRAB"?


Saludos
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: script en crontab no localiza módulos

Notapor explorer » 2013-05-29 04:20 @222

o conf ... es la orden para cpan para modificar la configuración del entorno.

A partir de ese momento, todas las instalaciones llevarán la orden de desinstalación previa, añadida.

Las páginas de manual las tienes en tu propio ordenador, o en cpan.org: CPAN.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 56 invitados