crystal-lang - 为什么在信号陷阱块中杀死的进程会变成僵尸而不是定期终止?
问题描述
如果我使用 创建进程Process.new
,它们可以被杀死.kill
。然而,他们在信号陷阱中变成了僵尸:
PROCESSES = {} of Int32 => Process
spawn {
loop { sleep 1 }
}
spawn {
x = Process.new("sleep", "100".split)
x.kill
sleep 0.4
puts x.terminated?
x = Process.new("sleep", "100".split)
PROCESSES[x.pid] = x
}
Signal::INT.trap {
Signal::INT.reset
PROCESSES.each { |pid, x|
puts "killing: #{pid}"
x.kill
sleep 1
puts "killed #{pid}? #{x.terminated?}"
}
}
sleep
运行此代码crystal run
并向进程发送 SIGINT 将始终.terminated?
为该进程返回 true,因为它处于僵尸 ( <defunct>
) 状态。
解决方案
当它们的父进程不收集它们的状态时,即当它不调用任何wait
函数族时,进程就会变成僵尸。
对于您的示例,您应该保留Process
实例并Process#wait
在发送终止信号后调用。如果您想同时为多个进程执行此操作,只需将每个调用都wait
用spawn
.
推荐阅读
- java - 如何接收从java程序发送的数据包
- java - 如何在多平台上使用 gradle
- javascript - 如何发送带有嵌入式附件的电子邮件 - 图像(laravel imap)
- python - Dockerfile,如何将文件修改为Docker内部的pip包
- javascript - 我是否需要分解声明以使用 d3.js 中的侦听器更新图表?
- python-3.x - 继承类中的方法
- nginx - 使用 nginx 生成文件内容
- python - 如何在 Conda 上添加显式 pip 依赖项
- reactjs - 如何为我的 react 项目创建一个全局 CSS 文件以应用于所有组件?
- authentication - Blazor WebAssembly 用于在标头中自动发送 Google 身份验证信息(即 id 令牌和访问令牌),但现在不