Когда я запускаю скрипт на 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, и используя любого пользователя, я могу добавлять и изменять файлы по своему усмотрению.
grep -i cron /var/log/syslog
2>&1
из командной строки, пока он не будет работать, как задумано. Любые полезные ошибки перенаправляются в файл, который не был создан; фактически проиграл. mutt
или в /var/spool/mail
). Сообщения об ошибках от cron по умолчанию отправляются в системную электронную почту. Также:
Для меня решение было таким же простым, как изменение режима доступа к файлам. Вместо:
output = open(filename,'wb')
Попробуйте:
output = open(filename,'rb+')
Я использовал это, чтобы почистить Craigslist для размещения вакансий (для себя) и для моделирования в базу данных. Все сделано на малиновом пи.
Я нашел это, и оно очень похоже на проблему, с которой я столкнулся, хотя я не совсем получил свой ответ отсюда. Задание cron выполнялось, но скрипт python не записывал файлы при выполнении через задание cron. Сценарий будет записывать веб-текстовые файлы, если он выполняется из командной строки.
Решением для меня было просто wb
- rb+
rb+
. Открывает файл для чтения и записи в двоичном формате. Указатель файла помещается в начало файла.
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, чтобы убедиться, что не было проблем с разрешениями.
У меня была похожая проблема:
f = open('./my_file.txt', 'w')
f.close()
Не открывался и не записывал файл при запуске из cron. Это решило это
f = open('<full_path_of_file>/my_file.txt', 'w')
f.close()