53

我的 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

我的 /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. /usr/bin/python /home/me/project/myscript.py作品。所以我不相信这是原因?

4

15 回答 15

51

互联网上有很多一半的答案,所以我想我会捕捉到这个以节省其他人一些时间。

首先,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

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

于 2018-01-26T00:30:08.787 回答
41

键入时会发生什么

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

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

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

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

于 2012-09-21T17:13:02.843 回答
17

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

\#!/bin/env python

该行将帮助定位解释器,无论它安装在哪个目录中,只要它位于搜索路径中。

于 2012-09-21T16:15:36.527 回答
11

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

  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 使用的环境相同的环境,这对调试非常有帮助。

于 2018-09-10T09:22:21.267 回答
9

通常,像这样的 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 中使用二进制文件和脚本的绝对路径。

于 2014-11-26T14:39:27.040 回答
3

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

于 2014-12-31T13:18:21.053 回答
3

处理此问题的最简单方法是将 python 安装的路径添加到 shell 脚本顶部的 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
于 2017-12-14T01:40:14.633 回答
3

试试这个

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

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

于 2018-02-20T19:21:59.490 回答
3

如果您将 anaconda 用于 python,那么使用的路径将是:

/home/username/anaconda3/bin/python test.py
于 2018-09-06T21:40:42.733 回答
1

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

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

于 2013-09-26T15:23:24.630 回答
1

有时我面临同样的问题。无论我按照这里的建议尝试什么,我都可能得不到结果。

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

#!/bin/bash

/full_path/python_script.py

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

编辑:当然,不要忘记执行以下操作(赋予执行权):

$chmod +x python_script.py
$chmod +x trigger.sh
于 2016-01-25T12:15:24.867 回答
0

尝试放入您的 crontab:

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

而不是

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

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

于 2012-09-21T17:20:16.340 回答
0
于 2012-09-21T18:12:04.820 回答
0

我正在研究的项目包括paramiko lib,当我从它运行 Check_.py 时cmdlin它运行良好,但是当我设置 crontab 时它失败并出现错误no module name paramiko

所以简而言之:
- 安装了两个不同的 python 版本 3.7 和 2.4,所以我曾经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]
于 2019-09-21T20:43:20.997 回答
0

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

which python3

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

于 2020-09-18T19:35:01.143 回答