O script Python não grava dados quando executado a partir do cron

6

Quando executo um script python em um terminal, ele é executado como esperado; faz o download do arquivo e salva no local desejado.

sudo python script.py    

Eu adicionei o script python ao crontab raiz, mas ele é executado como deveria, exceto que ele não grava o arquivo.

$ sudo crontab -l
> * * * * * python /home/test/script.py >> /var/log/test.log 2>&1

Abaixo está um script simplificado que ainda tem o problema:

#!/usr/bin/python

scheduleUrl = 'http://test.com/schedule.xml'
schedule = '/var/test/schedule.xml'

# Download url and save as filename
def wget(url, filename):
    import urllib2
    try:
        response = urllib2.urlopen(url)
    except Exception:
        import traceback
        logging.exception('generic exception: ' + traceback.format_exc())
    else:
        print('writing:'+filename+';')
        output = open(filename,'wb')
        output.write(response.read())
        output.close()

# Download the schedule
wget(scheduleUrl, schedule)

Eu recebo a mensagem "escrevendo: nome do arquivo"; dentro do log, para o qual a entrada cron é gerada. Mas o arquivo atual não é encontrado em lugar nenhum ...

O dir / var / test é chmodded para o 777 e usando qualquer usuário, tenho permissão para adicionar e alterar os arquivos como eu quiser.

    
por Ruud 28.11.2011 / 22:47

4 respostas

2

  • Verificar os arquivos de log grep -i cron /var/log/syslog
  • Adicione uma linha vazia ao final do crontab. Este é um bug conhecido há séculos, sem ter certeza se foi resolvido.
  • Remova o 2>&1 da linha de comando até que ele funcione conforme planejado. Quaisquer erros úteis são redirecionados para um arquivo que não é criado; efetivamente perdido.
  • Verifique se o e-mail recebido raiz (por exemplo, usando mutt ou /var/spool/mail ). Mensagens de erro do cron são enviadas para o email do sistema por padrão.

Além disso:

  • Reconsidere as permissões do 777 assim que possível. Ao executar a partir da raiz, 755 root: root deve ser suficiente para poder verificar os logs do usuário não privilegiado)
  • Reconsiderar a execução do script da raiz, é uma prática ruim.
por jippie 07.04.2012 / 23:43
1

O que funciona para mim

Crontab

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   python /home/username/somedir/test.py

Script em Python

scheduleUrl = 'http://example.com/index.html'
schedule = '/tmp/test.html'

# Download url and save as filename
def wget(url, filename):
    import urllib2
    try:
        response = urllib2.urlopen(url)
    except Exception:
        import logging
        logging.exception('error')
    else:
        print('writing:'+filename+';')
        output = open(filename,'wb')
        output.write(response.read())
        output.close()

# Download the schedule
wget(scheduleUrl, schedule)

Adicionadas variáveis de ambiente. Usado tmp em vez de var para verificar se não havia problemas de permissão.

    
por RobotHumans 08.04.2012 / 05:17
0

Para mim, a solução foi tão simples quanto mudar o modo de acesso a arquivos. Em vez de:

output = open(filename,'wb')

Tente:

output = open(filename,'rb+')

Eu usei isso para raspar craigslist para postagens de emprego (para mim) e para modelar em um banco de dados. Tudo feito em um pi de framboesa.

Eu achei isso e é muito parecido com o problema que eu estava tendo, apesar de não ter recebido minha resposta aqui. O cron job estava sendo executado, mas o script python não gravava arquivos quando executado por meio de um cron job. O script gravaria arquivos de texto copiados da Web, se executados a partir da linha de comando.

A solução para mim foi simplesmente wb to rb+ rb+ Abre um arquivo para leitura e gravação em formato binário. O ponteiro do arquivo colocado no início do arquivo.

    
por Andrew Sychra 06.03.2016 / 01:02
0

Eu tive um problema semelhante:

f = open('./my_file.txt', 'w')
f.close()

Não estava abrindo e gravando o arquivo quando executado no cron. Isso resolveu

f = open('<full_path_of_file>/my_file.txt', 'w')
f.close()
    
por Luis Miguel 08.04.2018 / 14:33