我正在使用连接相机运行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 回答
我怀疑这是一个问题,工作目录在shell中与cron运行时不同 . 我在类似情况下的经验是每次指定完整路径更安全 . os.path模块具有许多有用的功能 .
问题是你将文件名定义为
file = t+x+'.jpg'
但从不给出存储这些文件的目录 . 如果您在与图像相同的目录中手动运行python脚本,它将正常工作 . 但是当cron守护程序运行它时,它不会在同一目录中启动 .尝试:
失败可能有很多原因 .
(这是我昨天提供的类似问题的答案,但我不知道如何从我的手机应用程序中插入链接 . 我明天可以编辑这个)
cron守护程序的环境变量与登录shell不同 .
特别是用于定位命令的 PATH 变量可能不是您期望的变量:例如,在这种情况下找不到某些命令 .
你能提供cron守护进程运行脚本时生成的所有错误和输出吗?
如何调试cron守护进程执行的脚本?
首先,将 set -x 添加到脚本中,以使bash生成跟踪消息:
解决方案1
默认情况下,错误输出和标准输出都被收集并发送到当前用户邮箱的电子邮件中 . 所有登录在Linux和UNIX上都有自己的本地邮箱 . 以拥有crontab的用户身份连接并输入 mail :
mail 命令提供文本界面,使您可以列出和阅读收到的电子邮件 . 有帮助 .
解决方案2
编辑crontab并将输出重定向到磁盘上的文件
等待cron守护程序运行脚本并使用登录到/tmp/script.out文件的信息进行调试 .