¿Qué hay de malo con mi sintaxis de cronjob? Estoy tratando de usar un backtick (`)?

31

Esto es lo que me gustaría automatizar:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +%Y-%m-%dZ%I:%M`"

Aquí está el mensaje de error:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Terry G Lorber
fuente
2
Además del error de dar, considere poner esto en un script de esquema. Fingirá que el crontab es torpe y puede agregar comentarios y configuración a su archivo de script.
PeterMmm

Respuestas:

67

Desde crontab (5) :

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 un carácter%, se ejecutará mediante / bin / sh o mediante el shell especificado en la variable SHELL del archivo crontab. Los signos de porcentaje (%) en el comando, a menos que se escapen con una barra invertida (), se cambiarán a caracteres de nueva línea y todos los datos después del primer% se enviarán al comando como entrada estándar. No hay forma de dividir una sola línea de comando en varias líneas, como el "\" final del shell.

Simplemente agregue barras invertidas antes de los signos%:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Juliano
fuente
8

Para resolver el problema, escapa de tus% caracteres . date +%Y-%m-%ddebiera serdate +\%Y-\%m-\%d

Lamentablemente, esta respuesta llega un poco tarde, pero el problema no es la RUTA o los backticks: el problema es simplemente que el carácter de porcentaje '%' es un carácter especial que se utiliza para indicar un NEWLINE o un STDIN en las entradas de crontab .

Esto entra en conflicto con la entrada de formato del datecomando. Como tal, un comando que incluye: date +%Y-%m-%dse interpretará como:

date Y- m- d

Eric Kigathi
fuente
4

También tuve muchos problemas con los backticks. A veces necesita más de una aparición de comillas y backticks. Simplemente reemplácelos por $ ().

Ejemplo:

export NOW=`date`
by
export NOW=$(date)

-Gilson Soares

Guilsson
fuente
1
+1 Esta es la sintaxis preferida hoy en día de todos modos.
Dan Carley el
44
pero no tiene nada que ver con la pregunta del usuario.
Aaron Brown
1
por supuesto que sí, se trata de backsticks, lea la pregunta nuevamente.
Sergio Abreu
Gracias, me tomó un tiempo darme cuenta de que los backticks estaban rompiendo mis crons. Ahora también comencé a usar $ () en todos mis scripts
Eric Kigathi
-2

No tiene nada que ver con los backsticks. Una cosa terrible es que cron NO ve la RUTA, y DEBE decirle a cron "¿Qué es la RUTA?" una y otra vez en las secuencias de comandos cron.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

Y estoy a favor de escribir el comando en un archivo en lugar de pasar el comando literalmente en la línea cron. Es mucho más elegante tener

* * * * * /your/script/here

que

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

estas líneas pueden ir dentro de un archivo, chmod + x, y este archivo debe ser invocado.

Sergio Abreu
fuente