对我有用的东西

对我有用的东西

当我在终端中运行 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+ 一个文件,以二进制格式进行读写。文件指针位于文件的开头。

相关内容