2009-08-12 18 views
9

Esto me sigue sucediendo todo el tiempo: 1) Escribo un script (ruby, shell, etc.). 2) ejecutarlo, funciona. 3) ponerlo en crontab para que se ejecute en unos minutos, así que sé que se ejecuta desde allí. 4) No lo hace, no hay rastro de error, vuelve al paso 2 o 3 a 1000 veces.Cómo probar cosas en crontab

Cuando Ruby guión falla en el crontab, en realidad no puedo saber por qué se produce un error porque cuando la salida de tubo de esta manera:

ruby script.rb >& /path/to/output 

sorta obtener la salida de la secuencia de comandos, pero no lo hago obtener cualquiera de los errores y no obtengo los errores de bash (como si no se encuentra Ruby o el archivo no está allí)

No tengo idea de qué variables ambientales se establecen y si es o no un problema. Resulta que para ejecutar un script de ruby ​​desde crontab, debe exportar una tonelada de variables de entorno.

¿Hay alguna manera para que yo solo tenga crontab ejecute un script como si lo ejecutara yo mismo desde mi terminal?

Al depurar, tengo que reiniciar el temporizador y volver a esperar. Consume mucho tiempo.

¿Cómo probar cosas en crontab mejor o evitar estos problemas?

+0

¿Dónde está el rubí? ¿Está en una ruta del sistema como/usr/bin? Eche un vistazo a: http://ubuntuforums.org/showthread.php?t=190671 y vea si hay mensajes similares a lo que ve. Este fue un caso de ruby ​​fuera del camino que cron vería. – maxwellb

+0

Los errores (cualquier salida en realidad) de trabajos en mi crontab me son enviados por correo electrónico, el propietario del crontab. No recuerdo que necesitaba cambiar las configuraciones para que eso suceda ... ¿Verificó si tiene algún correo electrónico en el sistema en el que se ejecuta su cronjob? –

+0

¿Qué hay de dirigir su salida al syslog? http://angryruby.blogspot.com/2007/08/ruby-and-syslog.html – shuckster

Respuesta

1

Se puede escribir un guión envoltorio, llamado por ejemplo rbcron, que se ve algo como:

#!/bin/bash 
RUBY=ruby 
export VAR1=foo 
export VAR2=bar 
export VAR3=baz 

$RUBY "$*" 2>&1 

Esto redirigirá error estándar de rubí en la salida estándar. Luego ejecuta rbcron en su tarea cron, y la salida estándar contiene + err of ruby, pero también los errores "bash" existentes desde rbcron. En su entrada de cron, redireccione 2>&1 > /path/to/output para obtener mensajes de salida + error para ir a/ruta/a/salida.

+0

Cambie VAR1, etc., y valores a lo que sea que necesite exportar para ruby. No tengo estas respuestas. – maxwellb

1

Si realmente desea que se ejecute como a ti mismo, es posible que desee invocar rubí de un script de shell que las fuentes de su .profile/.bashrc etc. De esta manera se va a tirar en su entorno.

Sin embargo, el inconveniente es que no está aislado de su entorno, y si cambias eso, usted puede encontrar sus trabajos cron dejan de funcionar repentinamente.

+0

La fuente .profile/.bashrc configurará las mismas variables de entorno que las establecidas a partir de ese archivo, pero lo hará no "no se puede aislar de su entorno" con respecto al proceso en ejecución, pero tiene razón: crea una dependencia de un archivo en su directorio HOME. – maxwellb

3

ejecutar una orden set desde el interior de la secuencia de comandos rubí, dispararla desde crontab, y verá exactamente lo que está establecido y lo que no lo es.

7

"¿Hay alguna manera para que yo solo tenga crontab ejecutando un script como si lo ejecutara yo mismo desde mi terminal?"

Sí:

bash -li -c /path/to/script 

Desde la página del manual:

[vindaloo:pgl]:~/p/test $ man bash | grep -A2 -m1 -- -i 
    -i  If the -i option is present, the shell is interactive. 
    -l  Make bash act as if it had been invoked as a login shell (see 
      INVOCATION below). 
+0

Gran respuesta, esta es la forma adecuada de ejecutar las cosas desde un crontab cuando deseando un entorno idéntico a ejecutarlo desde una línea de comando. –

2

a averiguar el entorno en el que cron ejecuta trabajos, añade esta tarea cron:

{ echo "\nenv\n" && env|sort ; echo "\nset\n" && set; } | /usr/bin/mailx -s 'my env' [email protected] 

O envíe la salida a un archivo en lugar de a un correo electrónico.

6

día G,

Uno de los problemas básicos con cron es que se obtiene un entorno mínima está estableciendo por cron. De hecho, solo obtienes cuatro env. conjunto de var y son:

  • SHELL - ajustado a/bin/sh
  • LOGNAME - establecer a su ID de usuario que se encuentran en/etc/passwd
  • INICIO - establecer a su directorio home. como se encuentra en/etc/passwd
  • PATH - se ajusta a "/ usr/bin:/bin"

Eso es todo.

Sin embargo, lo que puede hacer es tomar una instantánea del entorno que desee y salvo que en un archivo.

Ahora haga su tarea programada fuente de un script de shell triviales que las fuentes de este env. archivo y luego ejecuta su script de Ruby.

Por cierto Tener una fuente envoltura de un env común. el archivo es una excelente manera de aplicar un entorno coherente para múltiples cronjobs. Esto también aplica el principio DRY porque le da solo un punto para actualizar las cosas según sea necesario, en lugar de tener que buscar entre un conjunto de scripts y buscar una cadena específica si, por ejemplo, se cambia una ubicación de registro o si ahora hay una utilidad diferente siendo utilizado, por ejemplo gnutar en lugar de alquitrán vainilla.

En realidad, esta técnica se utiliza con mucho éxito con el mono generación que se utiliza para implementar integración continua para un proyecto de software importante que es común a varias de las principales líneas aéreas del mundo. 3,500kSLOC se están verificando y compilando varias veces al día y más de 8,000 pruebas de regresión se ejecutan una vez al día.

HTH

'Avahappy,

Cuestiones relacionadas