我一直在尝试在 cron 中安排一个 python 脚本每天运行两次。该脚本使用几个 API 从网站提取信息并用这些信息更新 google 电子表格。该脚本正在运行 - 我可以手动运行它而没有任何问题,但是当我安排它从 cron 作业运行时,我看不到任何输出。
经过一些故障排除后,我发现了这个页面 -https://cronitor.io/cron-reference/cron-troubleshooting-guide
我完成了所有建议的步骤并找到了以下内容:
“对于 Python,您可能会发现您的 Web 应用程序正在使用您需要在 crontab 中调用的虚拟环境。”
如何在 ubuntu 中“调用虚拟环境”?我现在正处于一个不知道如何继续的阶段。如果有帮助的话,我正在 Ubuntu 20.04.3 LTS 上的 raspberry pi 3b 上运行我的脚本,我的脚本正在使用 Googlesheets API。
编辑:到目前为止我已经完成了以下故障排除:
我的用户有权限运行 cron
我在我的 cron 作业中使用直接路径
我已经检查了 chron guru 以确保我的 cron 计划设置正确,并且确实如此。
我从一个 cron 作业中获取输出,该作业将日期和时间打印到文件(
* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt
),所以我知道它正在运行。我已授予脚本可执行权限
chmod +x Script.py
我已确保我的用户有权运行该脚本
我已确保 cron 文件末尾有一个空白行
我创建了一个可执行 shell 文件来执行该脚本
我已确保 cron 使用的时间与系统时间相同
tail -f /var/log/syslog
在预定的时间显示脚本的输出,但当我检查电子表格是否已更新时,却没有我在 Python 脚本的顶部添加了 shebang
答案1
Python 虚拟环境是自包含的目录树,其中包含特定版本的 Python 安装以及许多附加包。
假设您的脚本使用“requests”包发出 HTTP 请求。如果您在虚拟环境中安装了请求,则需要确保脚本从 cron 运行时虚拟环境处于活动状态。否则您将得到ImportError: No module named requests
。
另一方面,如果您在系统范围内安装了请求,并且没有使用虚拟环境,那么您也不需要担心 cron 上下文中的问题。
以下是我解决您的特定问题的方法:我将在脚本中添加日志记录语句来检查假设和假设:脚本是否启动?它是否完全运行?如果它发出 HTTP 请求,它会返回什么 HTTP 状态?
也许脚本抛出了异常,但异常并未记录在任何地方。此代码片段仅捕获 stdout:
* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt
将其更改为同时捕获 stderr:
* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt 2>&1