Crontab 尝试时头痛 Python

Crontab Headaches when trying Python

我已经成功 运行 一个 crontab,但是当我引入一个 python 脚本时,没有任何反应。我已经验证我的 python 文件在 运行 直接来自 shell.

时有效

crontab 是:

* * * * * /Users/myname/myzsh.zsh

其中 myzsh.zsh 是:

#!/bin/zsh
/Users/mypath_to/python /Users/myname/testscript.py

什么都没发生

这是一个很常见的 cron 陷阱。

交互式 运行 和 cron 运行 之间的环境不同。 这会导致观察到的故障。

我假设您向我们 crontab -l 运行 展示了同一用户 运行 交互式脚本, 所以我们不与 root 有差异 运行 在 cron 下使用它。

您的 $PWD 当前工作目录可能很重要。 许多 cron 作业会做这样的事情:

cd some_dir && ./my_script.zsh

引用第 5 章 crontab 手册页:

... HOME, SHELL, and PATH may be overridden by settings in the crontab ...

... the environment handed to child processes is basically the one from /etc/rc.

真的想在执行脚本前美化一下环境

我猜你至少需要

env PYTHONPATH=. /Users/myname/myzsh.zsh

许多 my 脚本设置了 conda 环境 在调用 cPython 之前, 所以 $PATH 很好。 运行 简单的 cron 作业 env | sort >> /tmp/log.txt 查看默认情况下 PATH 的样子。 尝试以交互方式使用该 PATH 设置并 您可能会注意到脚本失败与在 cron 下一样。

您可能会发现埋葬 cd direxport PATH=... 很方便 在 myzsh.zsh 脚本中。

考虑 运行宁 python -m site 以帮助调试 sys.path 细节。


您的脚本可能正在退出并出现致命错误,退出状态为非零。 作为调试的辅助工具,考虑添加

MAILTO=prolle@some.email.provider.com

然后 cron 守护程序将向您发送脚本的输出, 如果它在 stdout + stderr 上产生多于零行。

原来 cron 本身没有权限。我将它拖放到首选项的安全部分,瞧!