【问题标题】:crontab automated python script won't upload to dropboxcrontab 自动 python 脚本不会上传到 Dropbox
【发布时间】:2016-06-23 00:52:21
【问题描述】:

我正在运行一个连接相机的树莓派,并想使用 crontab 每小时自动上传一次拍摄的照片。

另一个shell脚本每6分钟拍摄一次图片,该脚本也由crontab控制并且工作正常。

上传文件的 python 脚本在从 shell 调用时按预期工作。它构建正确的文件名并上传它们。这是脚本:

#!/usr/bin/env python 
import dropbox
import os.path
import time
#pictures are taken every 6 minutes so this is used to build the file names:
interval = ('00','06','12','18','24','30','36','42','48','54')

access_token = "my_token"
client = dropbox.client.DropboxClient(access_token)

#get current time
t = time.strftime("%Y-%m-%d_%H")

for x in interval:
        #build file name:
        file =  t+x+'.jpg'
        #check if file exsists:
        if os.path.isfile(file):
                #open file
                pic = open(file, 'rb')
                #upload picture:
                response = client.put_file(file, pic)
                print "picture " + file + " uploaded"
                pic.close()

我在 crontab -e 中添加了以下内容(路径正确)。所以它应该在每小时 56 分钟上传一次

56 * * * * python /home/pi/Pictures/pyPictureUpload.py

但是,没有上传任何内容。我还在 shell 脚本中使用相同的命令进行了尝试,并在 crontab 中调用了 shell 脚本:

56 * * * * /home/pi/Pictures/runUpload.sh

这是非常短的 shell 脚本:

!/bin/bash
python /home/pi/Pictures/pyPictureUpload.py

当直接从 shell 调用时,所有脚本都会按预期工作,但 crontab 不会自动运行任何脚本。我做错了什么?

【问题讨论】:

    标签: python linux bash raspberry-pi crontab


    【解决方案1】:

    失败的原因可能有很多。

    (这是我昨天为类似问题提供的答案,但我不知道如何从我的手机应用中插入链接。我可能会在明天编辑)

    cron 守护进程的环境变量与登录 shell 不同。

    尤其是用于定位命令的 PATH 变量可能不是您所期望的:例如,在这种情况下将找不到某些命令。

    您能否提供脚本由 cron 守护程序运行时生成的所有错误和输出?


    如何调试由 cron 守护进程执行的脚本?

    首先,在脚本中添加 set -x 以使 bash 生成跟踪消息:

    $ cat /home/william/bin/script.sh
    #!/bin/bash --
    set -x
    

    解决方案 1

    默认情况下,错误输出和标准输出都被收集起来,并通过电子邮件发送到当前用户邮箱。 所有登录在 linux 和 UNIX 上都有自己的本地邮箱。 以拥有 crontab 的用户身份连接并输入 ma​​il

    $ crontab -l
    * * * * * /home/william/bin/script.sh
    $ mail
    

    ma​​il 命令提供了一个文本界面,使您能够列出和阅读收到的电子邮件。 有帮助。

    解决方案 2

    编辑 crontab 并将输出重定向到磁盘上的文件

    $ crontab -l
    * * * * * /home/william/bin/script.sh 2>/tmp/script.out >&2
    

    等待 cron 守护进程运行脚本并使用记录到 /tmp/script.out 文件中的信息进行调试。

    【讨论】:

    • 感谢您的快速回答!我尝试了您的解决方案,但我的系统无法识别“邮件”。到目前为止,您的第二个解决方案有效,我现在知道 crontab 确实有效。但我在 script.out 中得到的唯一文本是“+ sudo python /home/pi/Pictures/pyPictureUpload.py”,这是我 script.sh 中的实际命令。
    • 很高兴您找到了解决方案。我知道第二个 *.py 不会产生输出或错误。在这种情况下,修改 *.py 使其生成跟踪消息以启用调试。
    【解决方案2】:

    我怀疑 shell 中的工作目录与 cron 运行时不同是一个问题。我在类似情况下的经验是,每次都指定完整路径更安全。 os.path 模块为此提供了许多有用的功能。

    问题在于您将文件名定义为file = t+x+'.jpg',但从未提供存储这些文件的目录。如果您在与图像相同的目录中手动运行 python 脚本,它将正常工作。但是当 cron 守护进程运行它时,它并没有在同一个目录中启动。

    试试:

    ...
    basePath = '/path/to/my/images'
    for x in interval:
        #build file name:
        file = os.path.join(basePath, t+x+'.jpg')
        #check if file exsists:
        if os.path.isfile(file):
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2020-03-16
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多