此问题与this answer有关我的其他问题有关。在这个答案中我被告知可以使用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()
显然无法识别它。为什么会这样?非常感谢你!
答案 0 :(得分:5)
它不是关于python,它更多的是关于进程本身:每个运行进程可能会产生一些具有不同PID的线程。如果父母没有被正确杀死,他们会留在那里(“僵尸线程”)。它们被分组为altogheter,其父级具有相同的ID。这就是为什么,在python中,你可以使用
os.killpg(pgid, sig)
杀死所有组。您可以在
下查看/proc/<PID>/task/
生成的任何线程的(您的实际进程ID在哪里)