我正在尝试从cron运行Python脚本。我使用crontab以用户而不是root身份运行命令。我的Python脚本在顶部#! /usr/bin/env python
有shebang,我做了chmod +x
它使脚本可执行。
从shell运行脚本时,脚本可以正常工作,但在使用crontab时则不行。我确实检查了/var/log/cron
文件,看到脚本运行但是stdout
或stderr
绝对没有任何内容。
最后,我创建了一个打印日期和字符串的小脚本,并且每隔一分钟调用一次,但是其他脚本没有。我不确定为什么我得到这些可变结果......
以下是crontab
SHELL=/bin/bash
#min #hour day-of-month month day-of-week command
#-------------------------------------------------------------------------
*/5 * * * * /path/to/script/script.py
以下是我的脚本的源代码,它不会从crontab运行,但是会在调用./script.py
时从它运行的shell运行。在我使用chmod +x
命令之后,脚本可以执行,顺便说一下......:
#! /usr/bin/env python
#create a file and write to it
import time
def create_and_write():
with open("py-write-out.out", "a+") as w:
w.write("writing to file. hello from python. :D\n")
w.write("the time is: " + str(time.asctime()) + "\n")
w.write("--------------------------------\n")
def main():
create_and_write()
if __name__ == "__main__":
main()
修改 我弄清楚出了什么问题。我需要将绝对文件路径放在脚本中,否则它会写入我没有计划的某个目录。
答案 0 :(得分:3)
您可以按照以下步骤自行解决此问题:
/path/to/script/script.py > /tmp/log 2> &1
/tmp/log
根据我的经验,问题主要与环境有关 在cron中,未设置env变量。因此,您可能必须在cron中为脚本显式设置env。
答案 1 :(得分:3)
好吧,我猜这个帖子仍然会帮助googlers
我使用一种解决方法来运行带有cron作业的python脚本。事实上,python脚本需要通过cron job精心处理
所以我让一个bash脚本处理所有这些。
我创建了一个bash脚本,它具有运行python脚本的命令。然后我安排一个cron作业来运行bash脚本。您甚至可以使用重定向器来记录执行python脚本的bash命令的输出。
例如
@reboot /home/user/auto_delete.sh
auto_delete.sh可能包含以下行: -
#!/bin/sh
echo $(date) >> bash_cron_log.txt
/usr/bin/python /home/user/auto_delete.py >> bash_cron_log.txt
所以我不需要担心Cron Jobs会崩溃python脚本。
答案 2 :(得分:0)
另一个原因可能是我们判断执行或未执行的方式是错误的。
答案 3 :(得分:0)
我还要强调一件事。我试图使用相同的技巧(使用shell脚本)在cron中运行python脚本,但这次它没有运行。这是@reboot cron。因此,我在上述评论之一中提到了在crontab中使用了重定向。并了解问题所在。
我在python脚本中使用了很多文件处理程序,而cron从用户的主目录运行该脚本。在这种情况下,python找不到用于文件处理程序的文件,并且将崩溃。
我用于故障排除的原因是我创建了一个crontab,如下所示。它会运行start.sh并将所有的stderror或stdoutput扔到status.txt文件中,并且status.txt中出现错误,提示我找不到用于文件处理程序的文件。没错,因为python脚本是由cron从用户的主目录执行的,然后该脚本仅在主目录中搜索文件。
@reboot /var/www/html/start.sh > /cronStatus/status.txt 2>&1
这会将cron执行过程中发生的所有事情都写入status.txt文件。您可以在那看到错误。我将再次建议使用bash脚本为cronjobs运行python脚本。
解决方案:-您都为脚本中使用的所有文件使用了完整路径(这对我来说是不可行的,因为我不希望脚本依赖于位置)。或者您从正确的目录执行脚本
所以我按如下方式创建了我的cron-
@reboot cd /var/www/html/ && /var/www/html/start.sh
此cron将首先将目录更改为正确的位置,然后启动脚本。现在,我不必担心对脚本中所有文件的完整路径进行硬编码。是的,虽然听起来很懒;)
而且我的start.sh看起来像-
#!/bin/sh
/usr/bin/python /var/www/html/script.py
希望对您有帮助
问候,
克里斯(Kriss)
答案 4 :(得分:0)
我遇到了类似的问题,但场景有所不同:我有一个bash脚本( run.sh )和一个Python脚本( hello.py )。当我输入
sh run.sh
在脚本目录中有效;如果我在crontab中添加了 sh run.sh 命令,则该命令无效。
要解决此问题,我在 run.sh 脚本中添加了以下行:
printenv > env.txt
通过这种方式,您可以查看运行脚本(或crontab)时使用的环境变量。通过分析手动运行和crontab运行生成的 env.txt 之间的差异,我注意到 PWD 变量是不同的。就我而言,我可以通过在 .sh 脚本顶部添加以下行来解决:
cd /PYTHON_SCRIPT_ABSOLUTE_PATH/
希望这可以帮助您!