crontab自动python脚本无法上传到dropbox

时间:2016-03-08 21:17:03

标签: python linux bash raspberry-pi crontab

我正在使用连接相机运行Raspberry pi,并希望使用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无法自动完成任何工作。我做错了什么?

2 个答案:

答案 0 :(得分:1)

失败可能有很多原因。

(这是我昨天提供的一个类似问题的答案,但我不知道如何从我的手机应用程序中插入一个链接。我明天可以编辑它)

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

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

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

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

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

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

解决方案1 ​​

默认情况下,错误输出和标准输出都被收集并发送到当前用户邮箱的电子邮件中。 所有登录在Linux和UNIX上都有自己的本地邮箱。 以拥有crontab的用户身份进行连接,然后输入 mail

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

邮件命令提供文本界面,可让您列出和阅读收到的电子邮件。 有帮助。

解决方案2

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

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

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

答案 1 :(得分:1)

我怀疑在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):

...