2009-04-23 17 views
5

Tengo un script de Perl (parte de la familia de "grabbers" XMLTV, específicamente tv_grab_oztivo).¿Por qué mi línea de comandos no se ejecuta desde cron?

puedo ejecutar correctamente así:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

que utilizan las rutas completas a todo para eliminar los problemas con el directorio de trabajo. Los permisos no deberían ser un problema.

Por lo tanto, si lo ejecuto desde la Terminal (Mac OSX) funciona bien.

Pero cuando configuré para ejecutar a través de un trabajo de cron, nada parece suceder en absoluto. No se crea ninguna salida, etc.

No hay nada de malo con el crontab por lo que puedo ver, porque si sustituyo un helloworld.pl por el script real, se ejecuta correctamente en el momento correcto.

Entonces, ¿qué puedo hacer para depurar? Puedo ver al mirar %ENV en los dos casos en que el entorno es muy diferente, pero ¿qué otros enfoques puedo llevar a la depuración? ¿Cómo puedo ver el resultado del trabajo cron, que podría ser algún tipo de mensaje "morir" o mensaje "no encontrado" de Perl desde el shell o lo que sea?

¿O debería intentar de alguna manera darle a la versión cron del comando el mismo entorno que cuando se ejecuta como yo?

Respuesta

8

Es a menudo porque no se obtiene el entorno completo cuando se ejecuta bajo cron. La mejor opción es capturar que la salida utilizando el comando:

(/sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 

y luego echar un vistazo a /tmp/qq.

Si no llegar a ser un entorno que falta, entonces puede que tenga que poner:

. ~/.profile 

o algo similar, en la cadena de ejecución de una tarea cron, tales como:

(. ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 
+0

Está funcionando. Gracias. Al final acabo de agregar PERL5LIB y PATH a $ ENV y todo estaba bien. – AmbroseChapel

-1

cron generalmente captura la salida de stdout y stderr y e-mailes cualquier salida al propietario de crontab.

¿Ha verificado dos veces su entrada de crontab para asegurarse de que sea válida y se ejecutará en el momento correcto?

Asegúrese de que el script no necesita ninguna variable de entorno establecida. De lo contrario, envuélvalo en otro script (bash), donde puede establecer las variables de entorno que espera el otro script.

+0

"¿Ha verificado dos veces su entrada en el crontab para asegurarse de que sea válida y se ejecutará en el momento correcto?" - Sí. Eso dije. – AmbroseChapel

+0

No importa, solo quería comprobarlo también. La sintaxis de crontab es complicada y es fácil equivocarse. – lothar

+0

Si no recibe la salida de cron enviada por correo, puede usar [email protected] en la parte superior de su crontab para cambiar a quién va la salida. Solo asegúrate de que tu correo local funcione. – preaction

3

Si está buscando% ENV en los dos casos, sugiero que, como primer paso en su script de Perl, configure% ENV a lo que es en un trabajo cron, y luego intente ejecutarlo desde el línea de comando. Es posible que necesite usar exec mismo una vez que esto tenga un control total:

BEGIN { 
    if (exists $ENV{something_in_your_env_not_in_cron}) { 
    %ENV = (...); 
    exec $^X, $0, @ARGV; 
    } 
} 

Ahora trata de ejecutarlo, y ver si hay algo que puede hacer para depurarlo (incluyendo ejecuta en perl -d si es necesario).Lo más probable es que veas que terminas añadiendo ítems nuevamente a% ENV uno por uno hasta que empiece a funcionar mágicamente (LD_LIBRARY_PATH es bueno para esto, pero ORACLE_HOME o DB2HOME para aplicaciones Oracle o DB2 también pueden ser buenas opciones) Luego puede establecer la variable en su secuencia de comandos o en el crontab.

+1

Gracias por su ayuda con esto, usted es realmente igual con Pax por ayudarme pero solo puedo dar una Respuesta correcta, lo siento. – AmbroseChapel

0

Me gustaría ejecutar un simple script de shell por ruta absoluta desde el comando cron. Dentro de esa secuencia de comandos, me aseguraría de atrapar stdout y stderr en un archivo conocido (o cognoscible). También me aseguraré de que se establezca suficiente entorno. En Unix, casi no se establece ningún entorno cuando se ejecuta un comando a través de cron - No estoy seguro acerca de MacOS X. El culpable estándar de los problemas es PATH. Tengo un .cronfile por separado que configura mi entorno de trabajo lo suficiente como para no tener problemas, es un análogo de .profile.

0

En ocasiones, si no puede descubrir qué está pasando mal con su línea de comandos, la forma más sencilla de solucionarlo es convertir todo en un script de shell. Lo ideal es que no tenga para hacer esto, pero puede ser la forma más rápida de resolver el problema.

del archivo: /files/cron1.sh

#!/bin/sh 
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

Y luego, en cron:

/files/cron1.sh 

Esto le permite probar la secuencia de comandos independiente de cron. Sin embargo, recuerde que su shell de inicio de sesión se ejecuta con diferentes variables de entorno que cron.

Cuestiones relacionadas