Cómo configurar correctamente un trabajo cron de raíz

22

Intenté configurar un trabajo cron de raíz para ejecutar un script Bash como root, para ejecutarlo en el minuto 7,37, cada hora, todos los días del mes, todos los meses. Este script se encuentra en /usr/bin y se llama 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 de Bash está disponible aquí .

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

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

sudo crontab -e

Y 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 -l confirmó 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.log , lo que significa que el trabajo nunca se inició correctamente.

Lo comprobé si ejecutaba el script desde la línea de comando

sudo /usr/bin/tunlrupdate.sh

a continuación, el archivo de registro se actualiza en consecuencia.

¿Por qué esta tarea cron no se está ejecutando 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 listar el registro del sistema sudo grep CRON /var/log/syslog . Sin embargo, obtuve 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 & amp; uso de la ruta absoluta desde la raíz para funciones en la secuencia de comandos o sin estas soluciones sugeridas aquí. Todavía obtengo este error.

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

Luego, enumere 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 obtengo el script bash ejecutándose. Esta vez no se muestra ningún error en el registro. Para obtener la seguridad de que este no era el contenido del guión, reduje el guión a las siguientes 3 líneas:

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

Todavía no logro completar el trabajo cron. Nada está escrito en el archivo de registro. Entonces, ¿incluso puede ser que un script vacío no se ejecute en cron? No lo entiendo Sé que estoy intentando un guión reducido a estas 2 líneas:

#!/bin/bash
exit 0

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

    
pregunta Antonio 11.02.2014 - 18:01

5 respuestas

7

Bueno, al fin la solución de trabajo. En el syslog vi lo repetitivo e intrigante:

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

Eso suena como que la raíz no fue reconocida como un cmd. Como ya usé el cron de la raíz usando $ sudo /usr/bin/tunlrupdate.sh . Luego probé con el script original (corregido por un error en la fecha UNIX cmd:% m, que es el mes que se usó para los 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 la raíz en la línea cron. Eso fue un error].

    
respondido por el Antonio 12.02.2014 - 01:12
51

Si desea ejecutar un script como usuario normal :

crontab -e

Y agrega la línea:

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

Si quiere ejecutar su script como root :

sudo crontab -e

Y agrega la misma línea:

07,37 * * * * /usr/bin/tunlrupdate.sh
    
respondido por el Guillaume 26.09.2014 - 12:01
2

Un "problema" con cron es la falta de variables de entorno (por razones de seguridad obvias ). Probablemente estás perdiendo PATH y HOME. 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

Deberá probar hasta que todas las variables necesarias estén definidas según lo requerido por el script.

    
respondido por el Alexis Wilke 11.02.2014 - 18:47
0

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

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

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

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

Otro truco es dirigir la salida del script a algún lugar. Agregar el /root/log.log . De esta forma, todo el resultado 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 ejecutar cada min para facilitar las pruebas y los controles.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log
    
respondido por el Cassio Seffrin 01.06.2015 - 01:54
0

Los mensajes de error de Cron generalmente se envían por correo electrónico de manera predeterminada. Puede verificar si hay un correo electrónico para root con sudo mail , o simplemente para verificar el contenido de /var/mail/root , por ejemplo, sudo less /var/mail/root .

Si los mensajes de correo electrónico no ayudan, también marque /var/log/syslog :

sudo grep CRON /var/log/syslog

Como ya dijo Alexis Wilke, cron tiene un mecanismo diferente para establecer variables de entorno.

Su script necesita

PATH=/sbin:/bin:/usr/bin

al crontab. HOME no debería ser necesario. Debe usar rutas absolutas en sus scripts, por ejemplo, /bin/date en lugar de date . Puede encontrar rutas adecuadas para cada comando con which command_name , por ejemplo,

$ which date
/bin/date
    
respondido por el Olli 11.02.2014 - 19:09

Lea otras preguntas en las etiquetas