2008-12-12 6 views
5

Tengo un crontab que se parece a¿Existe alguna restricción especial en los comandos ejecutados por cron?

0 0 * * * pg_dump DB_NAME > /path/to/dumps/`date +%Y%m%d`.dmp 

que funciona muy bien cuando corro de forma manual, pero no cuando cron lo ejecuta. Después de cavar a través de los registros, veo

Dec 12 00:00:01 localhost crond[17638]: (postgres) CMD (pg_dump DB_NAME > /path/to/dumps/`date +) 

Parece un problema con signos de porcentaje, pero la página man ni siquiera contiene el carácter de porcentaje en absoluto, así que pensé que estaban bien.

Respuesta

10

tienes que escapar signos de porcentaje con una barra invertida:

0 0 * * * pg_dump DB_NAME > /path/to/dumps/`date +\%Y\%m\%d`.dmp 

De man 5 crontab:

El '' sexta '' campo (el resto de la línea) especifica el comando para sea ejecutar. Toda la porción de comando de la línea, hasta un nueva línea o un carácter% , será ejecutada por/bin/sh o por el shell especificado en la variable SHELL del archivo crontab. Los signos de porcentaje (%) en el comando , a menos que se escapen con barra invertida (\), se cambiarán a caracteres de nueva línea , y todos los datos posteriores al primer% se enviarán al comando como entrada estándar . No hay forma de dividir una sola línea de comando en líneas múltiples, como el final de shell "\".

+0

Usted lo es. Estaba buscando en la página del hombre equivocada (solo hombre crontab en lugar de hombre 5 crontab). –

3

Hay otro problema característico que puede afectar a programas dirigidos por cron en comparación con la línea de comandos (que no sea la interpretación de '' % signos descritos por Robert Gamble).

Esa diferencia está en el medio ambiente. Si la ejecución del programa depende de variables de entorno especiales, funcionará cuando lo ejecute desde la línea de comando, con el entorno que normalmente usa, y probablemente funcionará si lo ejecuta con at porque eso captura el entorno cuando crea el trabajo. Pero cron no tiene una configuración de entorno especial.

Normalmente, configuro cron para ejecutar scripts por nombre de ruta absoluta, y ese script hace la configuración de entorno que necesito (agrega mi directorio $HOME/bin a PATH, por ejemplo). Incluso tengo una infraestructura estandarizada para esto: un script de shell que establece el entorno y ejecuta otros programas.

# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $ 
# Crontab file for Home Directory for Jonathan Leffler (JL) 
#----------------------------------------------------------------------------- 
#Min  Hour Day  Month Weekday Command 
#----------------------------------------------------------------------------- 
0  *  *  *  *  /usr/bin/ksh /work1/jleffler/bin/Cron/hourly 
1  1  *  *  *  /usr/bin/ksh /work1/jleffler/bin/Cron/daily 
23  1  *  *  1-5  /usr/bin/ksh /work1/jleffler/bin/Cron/weekday 
2  3  *  *  0  /usr/bin/ksh /work1/jleffler/bin/Cron/weekly 
21  3  1  *  *  /usr/bin/ksh /work1/jleffler/bin/Cron/monthly 

El guión en /work1/jleffler/bin/Cron establece el entorno y luego ejecuta el script del mismo nombre en /work1/jleffler/bin para hacer el trabajo real. Los nombres en el subdirectorio Cron son en realidad todos los enlaces al mismo script.

Cuestiones relacionadas