
Eu escrevi este pequeno script Python para fazer backups diários de um diretório contendo alguns arquivos (os backups devem ser alternados após uma semana). É isso:
$ 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()
quando executo manualmente, funciona conforme o esperado, criando um diretório de backup com o nome do dia da semana atual, mas não está sendo executado diariamente: deixei dentro de /etc/cron.daily por 3 dias e depois disso nenhum diretório de backup foi criado , o servidor estava ligado o tempo todo.
As permissões estão certas:
$ 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
O sistema é Ubuntu Server 12.04.2 LTS e a configuração do cron não foi adulterada desde a instalação.
Por que o script não está sendo executado?
Responder1
Isso está acontecendo porque seu script possui uma .py
extensão. Os arquivos /etc/cron.daily
são executados pelopeças de execução (8)comando e seu padrão é ignorar programas que não correspondem a várias regras. Você deve conseguir apenas remover a .py
extensão.
run-parts executa todos os arquivos executáveis nomeados dentro das restrições descritas abaixo, encontrados no diretório directory. Outros arquivos e diretórios são ignorados silenciosamente.
Se nem a opção --lsbsysinit nem a opção --regex forem fornecidas, os nomes deverão consistir inteiramente em letras maiúsculas e minúsculas ASCII, dígitos ASCII, sublinhados ASCII e hífens menos ASCII.
Por exemplo
touch /etc/cron.daily/test.py
chmod +x /etc/cron.daily/test.py
run-parts --test /etc/cron.daily
/etc/cron.daily/apache2
...
nenhum sinal 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 sim!
Responder2
A entrada do cron não deveria parecer
0 * * * 1-7 root /etc/cron.daily/file-store-backup.py
Normalmente não coloco o script real no arquivo cron, geralmente me refiro ao script no arquivo.