定时任务无法执行Python脚本

7

crontab 执行 Python 脚本失败。我正在使用的命令行运行 Python 脚本是可以的。

这些是我尝试过的解决方案:

  • main.py 的顶部添加 #!/usr/bin/env python
  • crontab 的顶部添加 PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
  • main.py 文件执行 chmod 777
  • 执行 service cron restart

我的 crontab 是:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

*/1 * * * * python /home/python_prj/main.py

日志在 /var/log/syslog 中:

Nov  6 07:08:01 localhost CRON[28146]: (root) CMD (python /home/python_prj/main.py)

只有这些。

main.py脚本调用了python_prj下的其他模块中的一些方法,这会有影响吗?

有人能帮我吗?


你尝试在你的cron命令中使用"/usr/bin/env/python /home/python_prj/main.py"了吗? - Tjaart
1
也许你的脚本因为某些原因——权限不足、在错误的工作目录中执行等——在能够完成任何操作之前就崩溃了? - Tjaart
我尝试了 /usr/bin/env/python,但仍然没有成功。 - yebw
将脚本的输出重定向到文件 command >> /path/to/output.log 2>&1,否则请检查cron发送的电子邮件。 - jfs
谢谢您的回复,我尝试添加output.log文件,但是这个文件里面什么都没有。 - yebw
3个回答

10
脚本调用了下的一些模块,这会有影响吗? 是的,会有影响。所有模块都需要在运行时找到。您可以通过多种方式实现此目的,但最合适的方法可能是在中设置变量。
您还可以设置变量,以便在出现任何时收到电子邮件通知。
[更新] 这是我的顶部:
www:~# crontab -l

DJANGO_SETTINGS_MODULE=djangocron.settings
PATH=...
PYTHONPATH=/home/django
MAILTO="cron-notices@example.com"
...
# m h  dom mon dow   command
10-50/10 * * * *               /home/django/cleanup_actions.py
...

每10分钟运行一次清理操作,但在整点时不进行清理。


我不明白,我在命令行中输入“python /home/python_prj/main.py”,它可以工作。PYTHONPATH 将被设置为 Python 的路径或模块的路径。 - yebw
所有在python_prj下的模块都是定制的。 - yebw
我刚刚删除了main.py导入的所有模块,但仍然无法工作。 - yebw
1
“仍未工作”是什么意思?你怎么知道从命令行运行时它正在工作?你是否尝试创建一个最小脚本,例如“打印‘hello world’”(或更好:“导入sys;打印sys.path”)来验证是否收到异常邮件或可以将输出重定向到文件?在cron下运行的脚本使用不同的shell(/bin/sh)和空环境启动,因此,仅仅因为某些东西在命令行上工作并不意味着它会在cron下工作。附:当将“python scriptname.py”放入您的crontab中时,shebang行将不起作用... - thebjorn
还有一件事...在cron下运行的程序也没有一个有用的工作目录--你尝试过从与项目完全无关的目录中运行脚本吗?如果你是从python_prj目录中运行它,即使你没有__init__.py文件,导入也会起作用... - thebjorn
显示剩余2条评论

4

你的脚本中有任何文件访问吗?如果有,你是否在脚本中使用了相对路径(甚至:没有明确的路径)?
当从命令行运行时,实际文件夹是“你的路径”,即你从哪里启动脚本。当通过cron运行时,“你的路径”可能会根据环境变量而异。
因此,尝试对访问的任何文件使用绝对路径。


有帮助的答案:我在我的Python脚本中访问了一个SQLite数据库,但没有提供完整路径。 - vrleboss

0

检查脚本的权限。确保它可以被cron执行 - 尝试使用chmod +x main.py命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接