尽管进程已终止,为什么 os.kill(pid, 0) 返回 None ?

2024-01-07

这个问题涉及到这个答案 https://stackoverflow.com/a/13402639/1125413我的其他问题之一。在这个答案中我被告知可以使用os.kill(pid, 0)检查子进程是否已终止。如果它还在运行,None被返回。如果它已终止,则会出现OSError被提出。到目前为止,这一切都运行良好,但现在我处于这样的情况os.kill(pid, 0)仍然返回None尽管子进程已经终止。进程 ID 是 82430,在 OSX 上的活动监视器中我找不到具有该 ID 的进程。但是,当我打开 Python shell 并输入os.kill(82430, 0),那么它仍然返回None。我不明白。

准确地说,我通过 Ajax GET 请求定期在 Django 视图中检查子流程的状态,如上所示。

服务器端的 Django 视图

def monitor_process(request):
    response_data = {}

    try:
        os.kill(int(request.GET['process_id']), 0)
        response_data['process_status'] = 'running'
    except OSError:
        response_data['process_status'] = 'finished'

    return HttpResponse(json.dumps(response_data), mimetype='application/json')

客户端Ajax调用

var monitorProcess = function(processId) {

    $.ajax({
        dataType: 'json',
        type: 'GET',
        url: '/monitor_process/',
        data: {'process_id': processId},
        success: function(response) {

            if (response.process_status == 'running') {
                // Only this branch is always executed

                // ...
            }

            else if (response.process_status == 'finished') {
                // This branch never gets executed

                // Stop checking for process status
                // The periodic check was started by 
                // window.setInterval in a different Ajax call
                clearInterval(monitorProcessId);

                // ...

            }
        }
    });
}; 

尽管该进程在某个时刻停止并消失在活动监视器中,os.kill()显然不认识它。为什么会这样呢?非常感谢!


这与Python无关,更多的是与进程本身有关:每个正在运行的进程可能会产生一些具有不同PID的线程。如果父线程没有被正确杀死,它们就会留在那里(“僵尸线程”)。它们与父级完全分组在同一 ID 下。这就是为什么在 python 中,你可以使用

os.killpg(pgid, sig) 

杀死所有的团体。您可以检查下

/proc/<PID>/task/ 

(你的实际进程ID在哪里)对于任何产生的线程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管进程已终止,为什么 os.kill(pid, 0) 返回 None ? 的相关文章

随机推荐