首页 文章

crontab自动python脚本不会上传到dropbox

提问于
浏览
2

我正在使用连接相机运行Raspberry pi,并希望使用crontab每小时自动上传一次拍摄的照片 .

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

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

#!/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 回答

  • 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):
    
    ...
    
  • 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
    

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

    解决方案2

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

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

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

相关问题