【问题标题】:How to debug a python script that is executed by crontab?如何调试由 crontab 执行的 python 脚本?
【发布时间】:2020-05-08 08:34:27
【问题描述】:

目前我有一个具有以下结构的 python 脚本

read_data()
    print("debugging statement 1")
    # random code 

plot_data(data)
    print("debugging statement 2")
    #random code 

if __name__ == '__main__':
   var = "test1"
   var2 = "test2"
   data_organized = read_data(var,var2)
   print("debugging statement 3")
   plot_data(data_organized)

   .....rest of code ..... 

我 ssh 到一个树莓派,然后从终端我可以写:

/full/path/to/env/python3 /full/path/to/script.py 

并且脚本执行完全没有错误。

我把它放在一个 crontab 中,用下面的 crontab 每分钟运行一次

*/1 * * * * /full/path/to/env/bin/python3 /full/path/to/script/script.py >> /random/path/to/where/i/want/output/cron_log.txt 2>&1

但是python代码抛出了一个错误。当我检查我的 cron_log.txt 文件时,我看到错误发生在 read_data() 函数的某处,因为我可以看到 print("debugging statement 3) 输出与应有的不同。但我看不到任何打印read_data() 函数内部的语句。

问题:

1.) 为什么我直接运行代码会完美运行,但使用 crontab 运行时却报错?

2.) 我的 crontab 条目是否正确?我希望它每分钟运行一次

3.) 如何在 read_data()、plot_Data() 函数中编写 print() 函数的输出?目前我只能在输出文件中看到 print(debugging3)。

【问题讨论】:

    标签: python linux cron


    【解决方案1】:

    回答您的问题:

    1. 因为与您的终端相比,cron 作业在非常不同的环境中运行。最有可能的 cron 作业是使用不同的权限从不同的文件夹执行的,你也不能依赖 PATH 变量是相同的(或任何其他变量)

    2. 好像没问题。

    3. 您的脚本正在中断read_data(),一旦您修复此问题,您将看到您的调试输出

    最后,为什么它不起作用以及如何解决它。由于您没有提供任何有意义的来源,我会说您的 read_data() 函数尝试使用相对路径访问一些数据文件并失败,因为脚本是从不同的文件夹执行的。您应该确保所有路径都是绝对路径,并且权限设置为允许访问这些文件。

    【讨论】:

      【解决方案2】:

      在另一个脚本中尝试这样的事情,它会调用你的script.py

      #!/usr/bin/env python
      # You can name me: logger.py
      import subprocess
      with open("output.txt", "w+") as output:
          subprocess.call(["python", "./script.py"], stdout=output);
      

      【讨论】:

      • 你是说创建这个新文件并在 crontab 中执行新文件吗?据我了解,这个新文件只是运行我的旧脚本并对日志记录做一些事情。有没有办法直接在我的脚本中修复日志记录而不必创建一个全新的文件?
      • 您可以尝试这种方法来获取完整的日志,以便稍后进行调试并查看您的代码真正失败的地方(您现在无法执行此操作,因为未正确保存日志) .一旦检测到错误,您将不再需要这个以前的脚本。
      【解决方案3】:

      错误的最可能原因是权限问题。 (见https://unix.stackexchange.com/questions/81805/what-are-the-runtime-permissions-of-a-cron-job

      要调试该过程,您可以使用remote_pdb 之类的工具,然后单步执行您的脚本。

      【讨论】:

        猜你喜欢
        • 2020-03-16
        • 2012-02-02
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多