Puedo decir:
MYPATH=/root/scripts
MYSCRIPT=doit.sh
0 1 * * * $MYPATH/$MYSCRIPT
en crontab -e
?
¿Es posible usar variables en crontab -e
?
Puedo decir:
MYPATH=/root/scripts
MYSCRIPT=doit.sh
0 1 * * * $MYPATH/$MYSCRIPT
en crontab -e
?
¿Es posible usar variables en crontab -e
?
Respuestas:
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 crontab
muestra 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).
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"
.
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 -c
o se definirá el shell SHELL
en 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/sh
normalmente es /bin/bash
así que el $( ... )
comando incorporado funciona, pero no lo haría en sistemas más antiguos donde /bin/sh
solo 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+m
se escribe como date +\%Y\%m
arriba.
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?