¿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 somone@null.com -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

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 somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

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


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


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.

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.