Traté de configurar un trabajo cron de root para ejecutar un script Bash como root, para ejecutar en el minuto 7,37, cada hora, todos los días del mes, todos los meses. Este script está ubicado /usr/bin
y nombrado 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 sucede en un registro ubicado en /var/log/tunlr.log
Para agregar este trabajo cron de root usé el estándar para crontab de root
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 -l
confirmó que el trabajo cron ha sido insertado.
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 que /var/log/tunlr.log
signifique que el trabajo nunca se inició con éxito.
Verifiqué que si ejecuto el script desde la línea de comando
sudo /usr/bin/tunlrupdate.sh
entonces el archivo de registro se actualiza en consecuencia.
¿Por qué este trabajo 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 algunas búsquedas, identifiqué el error en el archivo /usr/lib/php5/maxlifetime
como se explica aquí :Change #!/bin/sh -e --> #!/bin/sh -x
Luego enumerando 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, reduje el guión a las siguientes 3 líneas:
#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE
Todavía no consigo el trabajo cron. Nada está escrito en el archivo de registro. Entonces, ¿puede ser que un script vacío no se ejecute en cron? No lo entiendo Sé probar 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 por ...
Respuestas:
Si desea ejecutar un script como usuario normal :
Y agregue la línea:
Si quieres ejecutar tu script como root :
Y agregue la misma línea:
fuente
sudo crontab -e
lugar decrontab -e
). O algo más, de todos modos funcionaBueno, por fin la solución de trabajo. En el syslog vi lo repetitivo e intrigante:
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 mes, se usó durante minutos, que es% M) lo siguiente (que elimina la raíz de la línea cron):Esto resultó ser la solución final. [Aunque encontré decenas de literatura que indica la línea errónea con raíz en la línea cron. Eso fue un error].
fuente
crontab
comando (excepto los archivos crontab en/etc
)./etc/crontab
(el crontab de todo el sistema). Usandosudo crontab -e
el que está trabajando crontab de root que por lo general se pueden encontrar en/var/spool/cron/crontabs
Un "problema" con cron es la falta de variables de entorno (por razones obvias de seguridad). Probablemente te faltan PATH y HOME. Puede definirlos en el script directamente o en el archivo crontab.
Tendrá que probar hasta que todas las variables necesarias estén definidas como lo requiere el script.
fuente
/etc/crontab
archivo y las pegué en elsudo crontab -e
y el comando se ejecutó como root sin ningún problema. ¡Gracias!Los mensajes de error de Cron generalmente se envían, por defecto, por correo electrónico. Puede verificar si hay correo electrónico para root
sudo mail
, o simplemente verificando el contenido de/var/mail/root
, por ejemplosudo less /var/mail/root
.Si los mensajes de correo electrónico no ayudan, también verifique
/var/log/syslog
:Como Alexis Wilke ya dijo, cron tiene un mecanismo diferente para establecer variables de entorno.
Tu script necesita
al crontab.
HOME
No debería ser necesario. Debe usar rutas absolutas en sus scripts, por ejemplo, en/bin/date
lugar dedate
. Puede encontrar rutas adecuadas para cada comando conwhich command_name
, por ejemplo,fuente
/var/mail/root
. Puedes arreglar eso o intentarloPATH=...
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.
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 solo agrega esta línea a tu script. Entonces puedes analizar la salida
allEvnVars.txt
Otro truco es dirigir la salida del script a algún lugar. Agregando el
/root/log.log
. De esta manera, toda la salida del script se mantendrá en/root/log.log
También puede programar el script para ejecutar cada minuto para facilitar las pruebas y comprobaciones.
fuente