Crontab没有运行我的python脚本

时间:2012-09-21 16:07:08

标签: python crontab

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

我把它放在顶部的python脚本中:
    #!/usr/bin/python

我试过这样做:
    chmod a+x myscript.py

添加到我的crontab -e:


    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=""

* * * * * /home/me/project/myscript.py

* * * * * /home/me/project/myscript.py

我的/ var / log / cron文件说:

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

Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)

我得到了正确的结果。

这是myscript.py:

python /home/me/project/myscript.py

编辑:每条评论:是的,#!/usr/bin/python import sqlite3 def main(): con = sqlite3.connect("test.db") with con: cur = con.cursor() cur.execute("CREATE TABLE IF NOT EXISTS testtable(Id INTEGER PRIMARY KEY, Name TEXT)") cur.execute("INSERT INTO testtable(Name) VALUES ('BoB')") cur.execute("SELECT * FROM testtable") print cur.fetchall() if __name__ == "__main__": main() 存在。我也可以使用/usr/bin/python直接运行python脚本。 /home/me/project/myscript.py有效。所以我不相信这是原因?

15 个答案:

答案 0 :(得分:21)

键入

时会发生什么

/home/me/project/myscript.py进入shell?

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

你能使用test.dbcd的绝对路径到正确的目录然后执行你的python脚本吗?

这有助于在python中包含调试语句并记录一些数据。 Crontab可能非常难以调试。

答案 1 :(得分:14)

脚本可能无法启动,因为它无法找到python解释器。 Crontab环境可能与您正在使用的shell环境有很大不同。搜索路径可能显着不同。 此外,您通过显式启动python解释器来测试脚本,而您希望crontab只启动脚本。 我把这一行放在我的python脚本的顶部:

  

\#!/bin/env python

只要在搜索路径中,该行就可以帮助找到解释器,无论它安装在哪个目录中。

答案 2 :(得分:8)

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

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

Crontab命令:

# m h  dom mon dow   command
* * * * * /path/to/your_file.sh >> out.txt  2>&1

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

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

试试这个:

脚本文件

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

希望这可以为其他人节省一些调试时间!

答案 3 :(得分:5)

通常,像这样的crontab问题是由PATH环境变量比普通用户的PATH环境更具限制性/不同引起的。由于你的shell使用PATH环境来查找可执行文件(例如,在shell提示符下键入“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

或者,只需在crontab中使用二进制文件和脚本的绝对路径。

答案 4 :(得分:2)

我遇到了同样的问题。尽管手动执行的脚本正在运行,但在crontab中,上面提到的选项根本没有工作。我已经将我的脚本从/ home / user / script_directory /移动到/ opt / scripts /,它开始工作了。问题的可能原因应该是对位于主目录中的子文件夹的访问(读取)权限。

答案 5 :(得分:2)

试试这个

* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml

cron存在一些路径问题。所以当你使用python文件移动到目录时,cron就像魅力一样!

答案 6 :(得分:2)

如果您将anaconda用于python,则使用路径为:

/home/username/anaconda3/bin/python test.py

答案 7 :(得分:1)

最简单的方法是在shell脚本的顶部添加python安装路径到PATH。 类似的东西:

#!/usr/bin/env bash
export PATH="{path to your python installation}:$PATH"
python {python_file_name}.py

正如@Shargors所说,你可以通过

进行测试
env -i /bin/bash --noprofile --norc

答案 8 :(得分:1)

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

  1. 获取您在外壳中使用的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可以使您拥有与crontab使用的环境相同的环境,这对于调试非常有帮助。

答案 9 :(得分:0)

尝试输入你的crontab:

* * * * * python /path/to/your/script.py

而不是

* * * * * /path/to/your/script.py

在某些环境中,shebang线也是#!/usr/bin/env python env 是一个可执行文件,你必须知道“$ which env”的位置。

答案 10 :(得分:0)

  • cron用户(脚本失败的位置)和终端用户(脚本成功时)是否相同?
  • 您可以将作业输出重定向到Cron Job Log - How to Log?中提到的某个文件。我们可以看出这是否有帮助。

答案 11 :(得分:0)

虽然这里的答案清楚地描述了问题和解决方案,但我想添加另一个帮助我的答案。

如果您的python脚本正在调用数据库,那么请确保您可以在cron env中正确连接到db(以识别cron env - &gt; https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work)。我有一个从shell运行的文件,但不是作为crontab,除非我从python脚本中以root身份连接到数据库。

答案 12 :(得分:0)

有时我遇到同样的问题。无论我在这里做什么尝试,我都可能得不到结果。

所以我开始写&#34;触发&#34; bash脚本如下(让它命名为trigger.sh):

#!/bin/bash

/full_path/python_script.py

我从crontab调用trigger.sh,一切都很好。

编辑:当然,不要忘记做以下事情(给予执行权):

$chmod +x python_script.py
$chmod +x trigger.sh

答案 13 :(得分:0)

我正在处理包含paramiko lib的项目,当我从cmdlin运行Check_.py时,它工作正常,但是当我设置crontab时,它失败,错误为no module name paramiko

因此,简而言之:
 -安装了3.7和2.4的两个不同版本的python,因此我使用whreris python3来定位python路径/usr/local/bin/python3.7m,因此用该路径替换python将解决此问题。

示例

* * * * * cd /home/MKhair/hlthchk/BR/ && /usr/local/bin/python3.7m /home/MKhair/hlthchk/BR/Check_.py
* * * * * cd [ path-to-the-script-dir] && [path-to-python] [path-to-the-script]

答案 14 :(得分:0)

这可能对某人有用。我遇到了同样的问题(或者至少是类似的问题),而我的帮助是通过运行以下命令获取Python的路径(请注意要使用python,python3等的版本...) / p>

which python3

然后,我将python3替换为crontab文件中python3的完整路径。