2014-09-25 150 views
0

我想从cron运行Python脚本。我使用crontab作为用户而不是root来运行命令。我的Python脚本在顶部#! /usr/bin/env python有shebang,我做了chmod +x它使脚本可执行。Python脚本没有在cron中运行

该脚本在从shell运行但不使用crontab时不起作用。我没有检查/var/log/cron文件,看到脚本运行,但从stdoutstderr打印任何地方都没有。

最后,我做了一个小脚本,它打印日期和一个字符串,并称每分钟都有效,但这个脚本没有。我不知道为什么我收到这些变化的结果...

这是我在crontab

SHELL=/bin/bash 



#min #hour day-of-month month day-of-week  command 
#------------------------------------------------------------------------- 
*/5  *  *    *  *    /path/to/script/script.py 

这里条目我的脚本的源代码不会从crontab中运行,但会从运行它在被调用的时候就像是这样的./script.py。该脚本是可执行的我用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

请包括相关的代码 - 这将帮助我们回答。 – l0b0 2014-09-25 23:01:48

+0

在可能影响脚本的shell环境之间经常会有其他差异:不同的'PYTHONPATH'是一种可能性。您可能希望在'cron'下运行一个脚本,该脚本只是打印其环境,并将其与基于shell的手动执行的期望进行比较。 – 2014-09-25 23:42:56

+0

你重定向stdout和stderr吗?你期望看到它们出现在哪里? – cdarke 2014-09-26 04:59:47

回答

3

可以将此自己通过以下步骤解决:

  1. 修改的cron为/path/to/script/script.py > /tmp/log 2> &1
  2. 现在,让cron运行
  3. 现在读文件/tmp/log
  4. 你会发现在您面临的问题的原因,以便您可以修复它。

以我的经验,问题主要是与环境有关。
在cron中,env变量未设置。所以你可能必须在cron中明确地设置脚本的env。

+1

我尽力而为,并没有奏效。我在'/ tmp/log'中创建了这个文件,但是没有写在那里。另外,我认为使用'&>>'是将'stderr'和'stdout'写入文件的更好选择。 ;) – user3870315 2014-09-26 17:15:17

+0

你的脚本是否在控制台上打印了一些东西?当你说日志文件是空的时,我无法相信。有两种情况:'1.'在运行脚本时shell可能报告了一些错误。然后应该在文件中显示错误。 '2。'你的脚本应该展示了一些东西,如果有的话。 – cppcoder 2014-09-27 01:38:45

+1

我做了一个类似的脚本,它只写入日志文件,但没有做我最初想要的。它应该调用另一个程序运行,但它不会这样做。它甚至不打印任何错误信息或任何东西... 0_o – user3870315 2014-10-01 22:46:03

2

好的,我想这个主题仍然会帮助谷歌。
我使用解决方法来运行带有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作业的Python脚本崩溃。

+0

有趣。我可以尝试。 :) – user3870315 2016-08-11 14:55:01

+0

不错!这对我有用 - 我只需确保我的所有路径名都是在python脚本和bash命令中显式的。 – Trev14 2017-03-29 22:06:31

0

另一个原因可能是我们判断执行或不执行的方式是错误的。