Banda Ancha EU

Comunidad de usuarios
de fibra, móvil y ADSL

Ejecutar crontab al arrancar el sistema solo un día a la semana

BocaDePez
BocaDePez

Quisiera ejecutar un script en bash automáticamente con crontab.

Existe la opción @reboot /ruta/al/script.sh que hace que cada vez que se inicie la distro se ejecute. Pero yo quisiera que fuera solamente, por ejemplo, los miércoles.

Estoy mirando por Google pero no doy con la configuración correcta.

Un saludo.

Bramante
1

Yo lo haría mediante un script que se inicie al arrancar.

Que compruebe si es miércoles y, en caso afirmativo, que ejecute el código que necesitas.

rbetancor
1

Solución solo válida, si el equipo está encendido el Martes antes de las 23:59 … que sospecho, no es lo que quiere en OP.

Si lo que el OP pretende es que se ejecuta una tarea los Miércoles, UNA VEZ y solamente si el equipo es encendido, no importando la hora del Miércoles a la que se encienda … lo lleva jodido solo con Cron, por no decir que directamente no puede. Tendrá que tirar de @RebooT y como le ha dicho @Bramante, juguetear a comprobar en el script que es Miércoles y que no se ha ejecutado ya ese Miércoles, para evitar que si reinicias el equipo más de una vez un mismo Miércoles, se repita la tarea.

BocaDePez
BocaDePez

Gracias a todos por sus respuestas. Esto es lo que he hecho. Y parece que funciona.

En crontab:

@rebooT /usr/local/bin/compruebe_por_favor.sh

Lo anterior hace que cada vez que arranca la distro se ejecute lo siguiente:

#!/bin/bash
dia=$(date +%A)
if [ $dia = miércoles ]; then
/usr/local/bin/comprobar_discos_virtuales.sh
else
exit 0
fi

Aunque no es crítico, naturalmente todas las veces que arranque la distro en un mismo miércoles se ejecutará la comprobación de los discos virtuales. Supongo que para evitarlo sería necesario acceder al algún tipo de log de la distro (Debian 10) que registre las ejecuciones con su fecha completa. Pero no encuentro registros de esta ejecución en /var/log/dmesg, /var/log/daemon.log, /var/log/kern.log, /var/log/messages o en /var/log/syslog.

Un saludo.

🗨️ 3
rbetancor
#!/bin/bash
dia=$(date +%A)
today=$(date +%Y%m%d)
if [ grep -q $today /var/log/message ]
   exit 1
fi
logger $today
if [ $dia = miércoles ]; then
/usr/local/bin/comprobar_discos_virtuales.sh
else
exit 0
fi
🗨️ 2
BocaDePez
BocaDePez

Gracias por la respuesta pero creo que if no reconoce el comando grep. He probado de la siguiente manera pero tampoco va:

#!/bin/bash
dia=$(date +%A)
today=$(date +%Y%m%d)
busqueda=$(grep $today /var/log/messages | cut -d" " -f6)
if [ $today = "$busqueda" ]; then
   exit 1
fi
logger $today
if [ $dia = miércoles ]; then
/usr/local/bin/comprobar_discos_virtuales.sh
else
exit 0
fi
🗨️ 1
BocaDePez
BocaDePez

Creo que ya lo he solucionado. Era un problema de permisos de acceso a /var/log/messages: es necesario permisos de superusuario para acceder a él. Por eso crearemos nuestro propio "registro" en el directorio del usuario:

#!/bin/bash
dia=$(date +%A)
today=$(date +%Y%m%d)
busqueda=$(grep $today /home/usuario/.COMPRUEBA)
if [ $today = "$busqueda" ]; then
exit 1
else
echo $today > /home/usuario/.COMPRUEBA
if [ $dia = miércoles ]; then
/usr/local/bin/comprobar_discos_virtuales.sh
else
exit 0
fi
fi