Python скрипт не будет записывать данные при запуске из cron

Когда я запускаю скрипт на python в терминале, он работает как положено; загружает файл и сохраняет его в нужном месте.

sudo python script.py    

Я добавил скрипт python в корневой crontab, но затем он работает так, как и должно быть, за исключением того, что не записывает файл.

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

Ниже приведен упрощенный скрипт, который все еще имеет проблему:

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

Я получаю сообщение «writing: name of file;» внутри журнала, в который выводится запись cron. Но фактического файла нигде не найти ...

Каталог dir / var / test настроен на 777, и используя любого пользователя, я могу добавлять и изменять файлы по своему усмотрению.

7
задан 3 April 2012 в 11:59

4 ответа

  • Проверить файлы журнала grep -i cron /var/log/syslog
  • Добавить пустую строку в конец crontab, Это была известная ошибка целую вечность, не уверен, что она решена.
  • Удалите 2>&1 из командной строки, пока он не будет работать, как задумано. Любые полезные ошибки перенаправляются в файл, который не был создан; фактически проиграл.
  • Проверьте, получена ли root-почта (например, с помощью mutt или в /var/spool/mail). Сообщения об ошибках от cron по умолчанию отправляются в системную электронную почту.

Также:

  • Пересмотреть разрешения 777 как можно скорее. При запуске от root, 755 root: root должно быть достаточно для проверки журналов от непривилегированного пользователя)
  • Пересмотреть запуск скрипта от root, это плохая практика.
0
ответ дан 3 April 2012 в 11:59

Для меня решение было таким же простым, как изменение режима доступа к файлам. Вместо:

output = open(filename,'wb')

Попробуйте:

output = open(filename,'rb+')

Я использовал это, чтобы почистить Craigslist для размещения вакансий (для себя) и для моделирования в базу данных. Все сделано на малиновом пи.

Я нашел это, и оно очень похоже на проблему, с которой я столкнулся, хотя я не совсем получил свой ответ отсюда. Задание cron выполнялось, но скрипт python не записывал файлы при выполнении через задание cron. Сценарий будет записывать веб-текстовые файлы, если он выполняется из командной строки.

Решением для меня было просто wb - rb+ rb+. Открывает файл для чтения и записи в двоичном формате. Указатель файла помещается в начало файла.

0
ответ дан 3 April 2012 в 11:59

Что работает для меня

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

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)

Добавлены переменные окружения. Использовал tmp вместо var, чтобы убедиться, что не было проблем с разрешениями.

0
ответ дан 3 April 2012 в 11:59

У меня была похожая проблема:

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

Не открывался и не записывал файл при запуске из cron. Это решило это

f = open('<full_path_of_file>/my_file.txt', 'w')
f.close()
0
ответ дан 3 April 2012 в 11:59

Другие вопросы по тегам:

Похожие вопросы: