【发布时间】:2012-11-27 23:25:32
【问题描述】:
这个问题与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() 显然无法识别它。为什么会这样?非常感谢!
【问题讨论】:
-
线程呢?如果有任何线程与该进程关联,os.kill 不会返回任何 OSError,您是否也检查了这些?
-
@SamueleMattiuzzo 你到底是什么意思?到目前为止,我对线程没有任何经验,只有 Python 的 subprocess 模块。请更详细地向我解释一下。谢谢!
-
我将其发布为答案,因为它太长了,无法作为评论:)