我的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
有效。所以我不相信这是原因?
答案 0 :(得分:21)
键入
时会发生什么 /home/me/project/myscript.py
进入shell?
你能在crontbb命令中明确使用/usr/bin/python
吗?
你能使用test.db
或cd
的绝对路径到正确的目录然后执行你的python脚本吗?
这有助于在python中包含调试语句并记录一些数据。 Crontab可能非常难以调试。
答案 1 :(得分:14)
脚本可能无法启动,因为它无法找到python解释器。 Crontab环境可能与您正在使用的shell环境有很大不同。搜索路径可能显着不同。 此外,您通过显式启动python解释器来测试脚本,而您希望crontab只启动脚本。 我把这一行放在我的python脚本的顶部:
\#!/bin/env python
只要在搜索路径中,该行就可以帮助找到解释器,无论它安装在哪个目录中。
答案 2 :(得分:8)
互联网上有很多半答案,所以我想我会抓住这个来节省别人的时间。
首先,cronjob很难告诉你这个失败的地方。我建议将stderr输出发送到这样的日志文件:
# 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不同。 解决此问题的最简单方法是:
$ which python # it may be "python3" or something else
/usr/bin/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)
答案 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的完整路径。