当我在终端中运行 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 条目输出的内容。但是实际文件无处可寻...
目录 /var/test 被 chmodded 为 777,并且使用任何用户,我都可以随意添加和更改文件。
答案1
- 检查日志文件
grep -i cron /var/log/syslog
- 在 crontab 末尾添加一个空行,这是一个已知的错误,不确定是否已解决。
- 从命令行中删除,
2>&1
直到它按设计工作。任何有用的错误都会重定向到未创建的文件;实际上已丢失。 - 检查 root 是否收到邮件(例如使用
mutt
或 中的/var/spool/mail
)。cron 的错误消息默认发送到系统电子邮件。
还:
- 尽快重新考虑 777 权限。从 root 运行时,755 root:root 应该足以检查非特权用户的日志)
- 重新考虑从 root 运行该脚本,这是不好的做法。
答案2
对我有用的东西
定时任务
#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 来验证是否存在权限问题。
答案3
我遇到了类似的问题:
f = open('./my_file.txt', 'w')
f.close()
从 cron 运行时没有打开和写入文件。这解决了这个问题
f = open('<full_path_of_file>/my_file.txt', 'w')
f.close()
答案4
对我来说,解决方案很简单,只需更改文件访问模式即可。而不是:
output = open(filename,'wb')
尝试:
output = open(filename,'rb+')
我用它来抓取 Craigslist 上的招聘信息(我自己的),并将其建模到数据库中。所有操作都在 Raspberry Pi 上完成。
我找到了这个,它与我遇到的问题非常相似,尽管我没有从这里得到答案。 cron 作业正在执行,但通过 cron 作业执行时,python 脚本不会写入文件。如果从命令行执行,该脚本将写入网络抓取的文本文件。
对我来说,解决方案很简单,wb
打开rb+
rb+
一个文件,以二进制格式进行读写。文件指针位于文件的开头。