Cómo configurar correctamente un trabajo cron raíz

Cómo configurar correctamente un trabajo cron raíz

Intenté configurar un trabajo cron raíz para ejecutar un script Bash como raíz, para ejecutarlo en el minuto 7,37, cada hora, todos los días del mes, todos los meses. Este script se encuentra /usr/biny se denomina tunlrupdate.sh. Actualiza el DNS de Tunlr.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

Este script Bash está disponibleaquí.

Cuando se invoca, el script escribe lo que está sucediendo en un registro ubicado en/var/log/tunlr.log

Para agregar este trabajo cron raíz utilicé el estándar para el crontab de raíz

sudo crontab -e

E inserté estas 2 líneas al final. Espero que cron ejecute el script como root.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

Un comando posterior sudo crontab -lconfirmó que se había insertado el trabajo cron.

Reinicié Ubuntu y estaba revisando el archivo de registro si el trabajo cron se inició correctamente. Sin embargo, no hay nada en el archivo de registro /var/log/tunlr.logque indique que el trabajo nunca se inició correctamente.

Lo verifiqué si ejecuto el script desde la línea de comando

sudo /usr/bin/tunlrupdate.sh

luego el archivo de registro se actualiza en consecuencia.

¿Por qué esta tarea cron no se ejecuta según lo planeado en mi sistema?

ACTUALIZACIÓN 1: Todas las soluciones propuestas hasta ahora no funcionan. Agradezco a Olli por una CLI para enumerar el registro del sistema sudo grep CRON /var/log/syslog. Sin embargo, recibí un error CRON.

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

con la RUTA sugerida = inserción y uso de ruta absoluta desde la raíz para funciones en el script o sin las soluciones sugeridas aquí. Todavía recibo este error.

Después de buscar un poco, identifiqué el error en el archivo /usr/lib/php5/maxlifetimecomo se explica.aquí:Change #!/bin/sh -e --> #!/bin/sh -x

Luego enumerar el registro de errores CRON en mi sistema

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

Todavía no consigo ejecutar el script bash. Esta vez no se muestra ningún error en el registro. Para asegurarme de que este no era el contenido del guión, lo reduje a las siguientes 3 líneas:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

Todavía no logro realizar el trabajo cron. No hay nada escrito en el archivo de registro. Entonces, ¿incluso puede haber un script vacío que no se ejecute en cron? No lo entiendo. Estoy probando un script reducido a estas 2 líneas:

#!/bin/bash
exit 0

Y sigue siendo el mismo registro de errores. El script cron no pasa...

Respuesta1

Si desea ejecutar un script comousuario normal:

crontab -e

Y agrega la línea:

07,37 * * * * /usr/bin/tunlrupdate.sh

Si desea ejecutar su script comoraíz:

sudo crontab -e

Y agrega la misma línea:

07,37 * * * * /usr/bin/tunlrupdate.sh

Respuesta2

Bueno, por fin la solución que funciona. En el syslog vi lo repetitivo e intrigante:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

Parece que root no fue reconocido como cmd. Como ya usé el cron de root usando $ sudo /usr/bin/tunlrupdate.sh. Luego probé con el script original (corregido por un error en la fecha cmd de UNIX: %m, que es el mes, se usó durante minutos, que es %M) lo siguiente (que elimina la raíz de la línea cron):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

Esta resultó ser la solución final. [Aunque encontré decenas de publicaciones que indican la línea errónea con raíz en la línea cron. Eso fue un error].

Respuesta3

Un "problema" con cron es que la falta de variables de entorno (por ejemploobviorazones de seguridad). Probablemente te falten RUTA y INICIO. Puede definirlos en el script directamente o en el archivo crontab.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

Tendrá que realizar pruebas hasta que todas las variables necesarias estén definidas según lo requiere el script.

Respuesta4

Puede agregar esta línea en su secuencia de comandos. Entonces, después de verificar los registros cron y comprobar que su trabajo se ejecutó, puede obtener el mismo $PATH que tenían los crontabs.

/bin/echo $PATH > /root/path.txt

Y probablemente lo mejor que puede hacer para diagnosticar problemas en los scripts cron es obtener todas las variables de entorno de SO con el comando env en su script. Así que simplemente agregue esta línea a su script. Entonces puedes analizar la salida.allEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

Otro truco consiste en dirigir la salida del script a algún lugar. Añadiendo el /root/log.log. De esta manera toda la salida del script se mantendrá en/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

También puede programar el script para que se ejecute cada minuto para facilitar las pruebas y comprobaciones.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

información relacionada