crontab 自动 python 脚本不会上传到保管箱
crontab automated python script won't upload to dropbox
我是 运行 一个 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 没有自动执行任何工作。我做错了什么?
失败的原因可能有很多。
(这是我昨天针对类似问题提供的答案,但我不知道如何从我的 phone 应用程序中插入 link。我明天可能会编辑它)
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 文件的信息进行调试。
我怀疑 shell 中的工作目录与 运行 中的工作目录不同是一个问题。我在类似情况下的经验是每次都指定完整路径更安全。 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):
...
我是 运行 一个 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 没有自动执行任何工作。我做错了什么?
失败的原因可能有很多。
(这是我昨天针对类似问题提供的答案,但我不知道如何从我的 phone 应用程序中插入 link。我明天可能会编辑它)
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 文件的信息进行调试。
我怀疑 shell 中的工作目录与 运行 中的工作目录不同是一个问题。我在类似情况下的经验是每次都指定完整路径更安全。 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):
...