¿Cómo puedo ejecutar `date` dentro de un trabajo de pestaña cron?


117

Quiero crear un archivo de registro para un script cron que tenga la hora actual en el nombre del archivo de registro. Este es el comando que intenté usar:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

Lamentablemente recibo este mensaje cuando se ejecuta:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

He intentado escapar de la dateparte de varias maneras, pero sin mucha suerte. ¿Es posible hacer que esto suceda en línea en un archivo crontab o necesito crear un script de shell para hacer esto?

Respuestas:


180

Respuesta corta:

Escapar del %como \%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

Respuesta larga:

El mensaje de error sugiere que el shell que ejecuta su comando no ve el segundo carácter de retroceso:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

Esto también se confirma con el segundo mensaje de error que recibió cuando intentó una de las otras respuestas:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

La página de manual de crontab confirma que el comando se lee solo hasta el primer %signo sin escape :

El campo "sexto" (el resto de la línea) especifica el comando que se ejecutará. Toda la parte del comando de la línea, hasta una nueva línea o %carácter, será ejecutada por /bin/sho por el shell especificado en la SHELLvariable del cronfile. Los signos de porcentaje ( %) en el comando, a menos que se hayan escapado con una barra diagonal inversa ( \), se cambiarán a caracteres de nueva línea y todos los datos después del primero %se enviarán al comando como entrada estándar.


Perdón por mi ignorancia, pero ¿dónde ves estos mensajes de error? Cuando hago 'grep CRON / var / log / syslog' veo ningún mensaje de error, aunque fallaron cron - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@ Копать_Шо_я_нашел cron enviará un correo electrónico con el mensaje de error,
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode

7

También puede poner sus comandos en un archivo shell y luego ejecutar el archivo shell con cron.

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

cron

0 * * * * sh jobs.sh

6

Si desea hacer que la cadena de formato de fecha sea una variable (para evitar duplicar la cadena completa), NO escape %y NO la coloque$()

Por ejemplo, mientras declara la cadena, simplemente escriba:

DATEVAR=date +%Y%m%d_%H%M%S

Luego, escribe una declaración cron con $($VARIABLE_NAME)este:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Gracias a cyberx86 , su respuesta en ServerFault podría estar más completa:


1
DATEVAR = "fecha +% Y% m% d_% H% M% S"
Frank Fang

3

En cron, puede usar esta sintaxis simple:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

El formato de fecha de salida se volverá a ejecutar como cron_20180123.log
bala4rtraining

(1) ¿Qué estás diciendo que no haya sido dicho por la respuesta aceptada? (2) Su respuesta es mucho más complicada que la pregunta. Por ejemplo, agregó la -dopción, que no se usa en la pregunta (y no la explicó). ¿Cómo justifica llamar a esta "sintaxis simple"?
G-Man el

2

Todas las respuestas anteriores usan comillas dobles (no todas funcionaron para mi configuración). Esto funcionó para mí:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
¿Qué estás diciendo que no haya sido dicho por la respuesta aceptada? ¿Estás diciendo que funciona mejor sin comillas que con comillas? (Sugerencia: eso es muy poco probable.)
G-Man

La respuesta aceptada simplemente no funciona para mí. Este sí.
Manuel Schmitzberger

0

Una solución básica:

  • utilizar $()para ejecutar datecomandos y devolver resultados
  • formatee fecha y hora a UTC, escape del %personaje con\
  • añadir 2>&1al final de la transmisión de ambos stdouty stderren ese archivo de registro

Ejemplo:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

Salida:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.