¿Por qué no se ejecuta este script en cron.daily?

¿Por qué no se ejecuta este script en cron.daily?

Escribí este pequeño script de Python para realizar copias de seguridad diarias de un directorio que contiene algunos archivos (las copias de seguridad deberían rotar después de una semana). Eso es todo:

$ cat /etc/cron.daily/file-store-backup.py
#!/usr/bin/python3

import datetime
import calendar
import subprocess
import os.path

def main():
    origin = '/var/file-store'
    today_name = calendar.day_name[datetime.date.today().weekday()]
    dest = '/var/file-store-backup/' + today_name

    if os.path.exists(dest):
        subprocess.call(['rm', '-rf', dest])

    subprocess.call(['cp', '--reflink=always', '-a', origin, dest])
    subprocess.call(['touch', dest])

    last = open('/var/file-store-backup/LAST', 'w')
    print(today_name, file=last)

if __name__ == "__main__":
    main()

cuando lo ejecuto manualmente, funciona como se esperaba, creando un directorio de respaldo con el nombre del día de la semana actual, pero no se ejecuta diariamente: lo dejé dentro de /etc/cron.daily durante 3 días y después de eso no se creó ningún directorio de respaldo , el servidor estuvo encendido todo el tiempo.

Los permisos son correctos:

$ ls -l /etc/cron.daily/file-store-backup.py 
-rwxr-xr-x 1 root root 553 Abr 11 17:19 /etc/cron.daily/file-store-backup.py

El sistema es Ubuntu Server 12.04.2 LTS y la configuración cron no fue alterada desde la instalación.

¿Por qué no se ejecuta el script?

Respuesta1

Esto sucede porque su secuencia de comandos tiene una .pyextensión. Los archivos /etc/cron.dailyson ejecutados por elpiezas de ejecución (8)comando y su valor predeterminado es ignorar los programas que no coinciden con varias reglas. Debería poder eliminar simplemente la .pyextensión.

run-parts ejecuta todos los archivos ejecutables nombrados dentro de las restricciones que se describen a continuación, que se encuentran en el directorio directorio. Otros archivos y directorios se ignoran silenciosamente.

Si no se proporciona ni la opción --lsbsysinit ni la opción --regex, los nombres deben consistir enteramente en letras mayúsculas y minúsculas ASCII, dígitos ASCII, guiones bajos ASCII y guiones menos ASCII.

Por ejemplo

touch /etc/cron.daily/test.py
chmod +x /etc/cron.daily/test.py
run-parts --test /etc/cron.daily
/etc/cron.daily/apache2
...

no hay señales de test.py

mv /etc/cron.daily/test.py /etc/cron.daily/test
run-parts --test /etc/cron.daily 
/etc/cron.daily/apache2
...
/etc/cron.daily/test

¡ta da!

Respuesta2

¿No debería verse así la entrada cron? 0 * * * 1-7 root /etc/cron.daily/file-store-backup.py

Normalmente no pongo el script real en el archivo cron, normalmente me refiero al script en el archivo.

información relacionada