【问题标题】:How to find out if a program crashed with subprocess?如何找出程序是否与子进程崩溃?
【发布时间】:2011-06-02 05:39:09
【问题描述】:

我的应用程序创建子进程。通常,这些进程运行和终止没有任何问题。但是,有时它们会崩溃。

我目前正在使用 python subprocess module 来创建这些子进程。我通过调用Popen.poll() 方法检查子进程是否崩溃。不幸的是,由于我的调试器在崩溃时被激活,轮询不会返回预期的输出。

我希望能够看到调试窗口(而不是终止它)并且仍然能够检测到进程是否在 python 代码中崩溃。

有没有办法做到这一点?

【问题讨论】:

    标签: python debugging subprocess popen


    【解决方案1】:

    考虑事项:

    子进程的 subprocess.check_output() 返回代码
    用于进程和子分析的 psutil(以及更多)
    线程库,以便在您决定如何处理崩溃(如果需要)后监控脚本中的这些子状态

    import psutil
    myprocess = psutil.Process(process_id) # you can find your process id in various ways of your choosing
    for child in myprocess.children():
        print("Status of child process is: {0}".format(child.status()))
    

    您还可以使用线程库将您的子进程加载到单独的线程中,然后与您的其他进程同时执行上述 psutil 分析。

    如果您发现更多信息,请告诉我,我发现这篇文章并非巧合。

    【讨论】:

      【解决方案2】:

      我找到了解决此问题的方法。我使用了另一个问题Can the "Application Error" dialog box be disabled?

      中给出的解决方案

      【讨论】:

      【解决方案3】:

      当您的调试器打开时,该进程尚未完成 - 而subprocess 只知道进程是正在运行还是已完成。所以不,没有办法通过subprocess 做到这一点。

      【讨论】:

      • 感谢您的回答,有没有其他方法可以用python解决这个问题?
      • 如果你的子进程有一些你的主进程可以监控的输出方式,它们可以定期输出“我还活着”的指标,并且在相当长的一段时间内没有这样的指标时间可能意味着子进程已经崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多