2012-09-21 176 views
14

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

我已在顶部的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 

我的/ var/log/cron文件说:
Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)

但我的脚本没有运行,因为当我检查我的sql数据库时,没有任何改变。如果我直接在终端运行它,就像这样:

python /home/me/project/myscript.py

我得到正确的结果。

这是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存在。我也可以直接使用/home/me/project/myscript.py直接运行python脚本。 /usr/bin/python /home/me/project/myscript.py工程。所以我不相信这是原因?

+0

脚本中有什么?这是否取决于任何环境? – tMC

+0

是的,我认为我们需要在您的myscript.py中看到 –

+2

将MAILTO变量设置为您的用户名。然后你会在你的邮件中得到一些错误信息,这可能会提供一些线索。 – unutbu

回答

11

,当你键入

/home/me/project/myscript.py到外壳会发生什么?

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

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

这有助于在你的python中有调试语句并记录一些数据。 Crontab可能非常棘手的调试。

+0

哈哈,你做到了!我改变了test.db使用绝对路径'/ home/me/project/test.db' ...并且它工作正常! – user1636922

9

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

+0

我目前在bash中,并且我已经添加了你的建议'#!/ bin/env python'。它似乎没有工作。 – user1636922

+0

首先,看看你是否有/ bin/env或env是否在不同的目录中。 – shargors

+23

启动以下命令以获得与crontab使用的环境相同的环境:env -i/bin/bash --noprofile --norc 然后启动您的python脚本并查看它为什么失败。这应该给你一个想法。 – shargors

1

尝试把在crontab:

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

而不是

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

而且shebang行是在某些环境#!/usr/bin/env pythonenv是一个可执行文件,您必须知道它与“$ which env”的生活位置。

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

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

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

1

通常,像这样的crontab问题是由于PATH环境变量比正常用户的PATH环境更具限制性/不同。由于您的shell使用PATH环境来查找可执行文件(例如,当您在shell提示符下键入“python”时/ usr/bin/python位于/ usr/bin中),当PATH缺少常见位置时,如/ usr/bin或/ usr/sbin,你的cron作业将失败。这已经让我有很多次了。简单的解决方法是在需要它的任何命令之前,将自己明确地设置在crontab文件的顶部附近。所以,只要编辑crontab像往常一样,并添加像这样接近顶部(如果二进制文件没有在下面的路径之一,你需要给它一个冒号后加):

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

我d也有同样的问题。尽管手动执行的脚本工作正常,但在crontab中没有任何上述选项可用。我已将脚本从/ home/user/script_directory /移至/ opt/scripts /并开始工作。问题的可能原因应该是对位于主目录中的子文件夹的访问(读取)权限。

0

有时我面临同样的问题。不管我在这里建议什么,我都可能得不到结果。

于是我开始写“触发” bash脚本如下(我们将其命名为trigger.sh):

#!/bin/bash 

/full_path/python_script.py 

,我来自crontab中调用trigger.sh,一切都很好。

编辑:当然,不要忘记做以下(给予执行权限)来处理,这是给你的Python安装的路径添加到PATH的shell脚本的顶部

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

最简单的方法。 喜欢的东西:

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

正如@Shargors说,你可以通过

env -i /bin/bash --noprofile --norc 
0

测试它有很多在互联网上一半的答案,所以我想我会抓住这个救别人一些时间。

首先,cronjob在告诉你这个失败的地方做得不好。我建议发送标准错误输出到一个日志文件是这样的:

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 

希望这样可以节省别人的一些调试时间!

0

试试这个

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

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