¿Es posible usar variables en crontab -e?

13

Puedo decir:

MYPATH=/root/scripts  
MYSCRIPT=doit.sh

0 1 * * * $MYPATH/$MYSCRIPT

en crontab -e?

¿Es posible usar variables en crontab -e?

usuario19496
fuente

Respuestas:

15

Sí, puede definir y usar variables de esta manera. Hay una limitación (que no ha tocado en sus ejemplos): la cadena a la derecha del =signo se interpreta literalmente, con espacios iniciales eliminados, por lo que no puede usar construcciones como FOO=$BAR/qux(por ejemplo PATH=$HOME/bin:$PATH, no hará nada útil).

Esto se indica en la documentación, que puede ver ejecutando

man 5 crontab

(Tenga en cuenta que man crontabmuestra la documentación del crontab comando , en la sección 1 del manual; desea la documentación del crontab formato de archivo , en la sección 5).

Gilles 'SO- deja de ser malvado'
fuente
7

Acabo de intentarlo, sí, es posible. Puedes resolverlo con este simple ejemplo, ponlo en tu crontab:

FOO = qwerty
* * * * * echo $ FOO> ~ / out

Y revise el archivo ~/out(actualizado cada minuto), debe contener "qwerty".

Ciro
fuente
2
+1 para mostrar cómo el OP podría resolver cosas similares por su cuenta.
Arthaey
Un mejor ejemplo hará uso de $ FOO dentro del script de destino.
Acumenus
4

Si bien los crontabs de Linux admiten la definición de algunas variables que contienen valores literales, no tiene mucho uso además de condensar texto largo en una representación más corta o controlar algunas cosas sobre el cron en sí, como dónde enviar la salida de correo electrónico.

La flexibilidad es comprender que la parte del comando de la entrada cron se pasará /bin/sh -co se definirá el shell SHELLen los sistemas que usan Vixie cron (el que generalmente se instala en los sistemas Linux). Lo que esto significa es que el resto de la línea de comandos es un simple script de shell. NOTA: tenga en cuenta qué shell se está utilizando. En Linux /bin/shnormalmente es /bin/bashasí que el $( ... )comando incorporado funciona, pero no lo haría en sistemas más antiguos donde /bin/shsolo se entiende `.

Por ejemplo, tengo una línea crontab simple que archiva un archivo MBX de mensajes guardados mensualmente y lo comprime. Se parece a esto:

15 0 1 * *  nf=MailFeed-$( date +\%Y\%m ).mbx && cd Logs && mv MailFeed.mbx $nf && bzip2 -9 $nf

Esto se ejecutará el primero de cada mes a las 12:15 a.m., establecerá un nuevo nombre de archivo con CCYYMM, moverá el archivo actual al nuevo nombre y lo comprimirá. Lo que hay que recordar es que un no escapado %(signo de porcentaje) se tratará como una nueva línea y los datos siguientes se enviarán como stdin al comando que precede al signo de porcentaje. Es por eso que lo normal date +Y+mse escribe como date +\%Y\%marriba.

D francés
fuente
-2

No, no puede un cronjob solo puede contener elementos cron. ¿No es una opción crear un script bash y ejecutar el script bash a través de un cronjob?

Maran
fuente
1
Es cierto en algunos otros dispositivos, pero el cron de Linux admite la asignación de variables de entorno.
Gilles 'SO- deja de ser malvado'