Crontab没有运行我的python脚本

use*_*922 32 python cron

我的python脚本没有在我的crontab下运行.

我把它放在顶部的python脚本中:
crontab -e

我试过这样做:
myscript.py

添加到我的crontab -e:

#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

我的/ var/log/cron文件说:
/usr/bin/python

但是我的脚本没有运行,因为当我检查我的sql数据库时,没有任何改变.如果我直接在终端中运行它,如下所示:

/home/me/project/myscript.py

我得到了正确的结果.

这是myscript.py:

chmod a+x myscript.py
Run Code Online (Sandbox Code Playgroud)

编辑:每条评论:是的,/usr/bin/python /home/me/project/myscript.py存在.我也可以使用just直接运行python脚本crontab -e.myscript.py作品.所以我不相信这是原因?

dm0*_*514 24

键入时会发生什么

/home/me/project/myscript.py 进壳?

你可以/usr/bin/python在你的crontbb命令中明确使用吗?

您可以使用绝对路径到您的test.dbcd正确的目录然后执行您的python脚本?

这有助于在python中包含调试语句并记录一些数据.调试Crontab非常棘手.

  • 哈哈,你做到了!我将test.db更改为使用绝对路径`/ home / me / project / test.db` ...并且它起作用了! (2认同)

sha*_*ors 15

脚本可能无法启动,因为它无法找到python解释器.Crontab环境可能与您正在使用的shell环境有很大不同.搜索路径可能显着不同.此外,您通过显式启动python解释器来测试脚本,而您希望crontab只启动脚本.我把这行放在我的python脚本的顶部:#!/ bin/env python.只要它在搜索路径中,该行将帮助定位解释器,无论其安装在哪个目录中.

  • 启动以下命令以使其具有与crontab使用的环境相同的环境:env -i/bin/bash --noprofile --norc然后启动python脚本并查看它失败的原因.这应该给你一个想法. (42认同)
  • @shargors我不能告诉你你的评论对我有多大帮助.在我看来,你的评论应该是公认的答案:在OP案例中python脚本失败的原因的*详情*不如解决环境问题的一般方法那么重要.谢谢!:) (7认同)

小智 11

互联网上有很多半答案,所以我想我会抓住这个来节省别人的时间.

首先,cronjob很难告诉你这个失败的地方.我建议将stderr输出发送到这样的日志文件:

Crontab命令:

# m h  dom mon dow   command
* * * * * /path/to/your_file.sh >> out.txt  2>&1
Run Code Online (Sandbox Code Playgroud)

由于这可能以用户身份运行命令,因此请检查主目录中的日志文件.请注意,此脚本每分钟运行一次,这对调试很有用.

下一个问题是你可能有一个路径问题......因为脚本可能正试图从你的主目录执行.此脚本设置当前目录,将其回显到文件,然后运行您的程序.

试试这个 :

脚本文件

#!/bin/sh
cd "$(dirname "$0")";
CWD="$(pwd)"
echo $CWD
python your_python_file.py
Run Code Online (Sandbox Code Playgroud)

希望这能节省别人一些调试时间!!!

  • 谢谢!你为我节省了大量调试时间!!!我遇到了 cron 随机不运行的问题,这是一场噩梦。 (3认同)
  • @EnriqueBet 我后来找到了答案。检查此链接:) https://unix.stackexchange.com/questions/99263/what-does-21-in-this-command-mean (3认同)
  • 最后一部分“2>&1”是什么意思? (2认同)

Bri*_*ian 9

通常是因为crontab 使用的python 与您在shell 中使用的python 不同。解决这个问题的最简单方法是:

  1. 获取你在shell中使用的python:

$ which python # it may be "python3" or something else /usr/bin/python

  1. 在 crontab 文件中使用特定的 python:

* * * * * /usr/bin/python test.py

还想提一下,env -i /bin/bash --noprofile --norc在 shell中使用可以让您拥有与 crontab 使用的环境相同的环境,这对调试非常有帮助。


JJC*_*JJC 7

通常,类似crontab的问题是由PATH环境变量比普通用户的PATH环境更具限制性/不同引起的。由于您的外壳程序使用PATH环境查找可执行文件(例如,在外壳程序提示符下键入“ python”时,在/ usr / bin中找到了/ usr / bin / python),因此当PATH缺少常见位置时,例如/ usr / bin或/ usr / sbin,您的cron作业将失败。这已经困扰了我很多次。简单的解决方法是在需要任何命令之前,在crontab文件顶部附近自己显式设置PATH。因此,只需像往常一样编辑crontab并在顶部附近添加类似的内容(如果您的二进制文件不在以下路径之一中,则需要在冒号后面添加它):

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
Run Code Online (Sandbox Code Playgroud)

另外,只需在crontab中使用二进制文件和脚本的绝对路径即可。


小智 5

尝试这个

* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml
Run Code Online (Sandbox Code Playgroud)

cron 存在一些路径问题。因此,当您移动到包含 python 文件的目录时,cron 的工作方式就像魅力一样!