Ubuntu – Python script won’t write data when ran from cron

pythonscripts

When I run a python script in a terminal it runs as expected; downloads file and saves it in the desired spot.

sudo python script.py    

I've added the python script to the root crontab, but then it runs as it is supposed to except it does not write the file.

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

Below is a simplified script that still has the problem:

#!/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)

I do get the message "writing:name of file;" inside the log, to which the cron entry outputs. But the actual file is nowhere to be found…

The dir /var/test is chmodded to 777 and using whatever user, I am allowed to add and change files as I please.

Best Answer

  • Check log files grep -i cron /var/log/syslog
  • Add an empty line to the end of the crontab, This has been a known bug for ages, not sure if it is solved.
  • Remove the 2>&1 from the command line until it works as designed. Any usefull errors are redirected to a file that is not created; effectively lost.
  • Check if root received mail (eg. using mutt or in /var/spool/mail). Error messages from cron are sent to system email by default.

Also:

  • Reconsider the 777 permissions as soon as possible. When running from root, 755 root:root should be sufficient to be able to check the logs from unprivileged user)
  • Reconsider running the script from root, it is bad practise.
Related Question