gpt4 book ai didi

ruby - 进程如何以 Process.wait 不会注意到的方式死亡?

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:53 27 4
gpt4 key购买 nike

我有这个 ruby​​ 脚本来管理 que过程。 que 不支持多进程,参见讨论 here ):

#!/usr/bin/env ruby

cluster_size = 2
puts "starting Que cluster with #{cluster_size} workers"; STDOUT.flush

%w[INT TERM].each do |signal|
trap(signal) do
@pids.each{|pid| Process.kill(signal, pid) }
end
end

@pids = []
cluster_size.to_i.times do |n|
puts "Starting Que daemon #{n}"; STDOUT.flush
@pids << Process.spawn("que --worker-count $MAX_THREADS")
end

Process.waitall

puts "Que cluster has shut down"; STDOUT.flush

该脚本几个月来一直运行良好。前几天我发现东西处于脚本运行的状态,但是两个子进程都死了。

我尝试过尝试复制它。我用各种信号杀死了 child ,让他们提出异常。在所有情况下,脚本都知道进程已结束,并且它自己也已结束。

子进程怎么可能在父脚本不知道的情况下死掉了?

最佳答案

How could the child process have died without the parent script knowing?

我的猜测是子进程变成了僵尸进程并被 Process.waitall 遗漏了。当它发生时,您是否检查子进程是否是僵尸进程?

僵尸:如果您有僵尸进程,则意味着这些僵尸进程尚未被其父进程等待(使用 ps -l 检查 PPID)。最后你有三个选择:修复父进程(让它等待);杀死 parent ;或克服它。

你能检查你的信号列表并捕获它吗?

您可以列出所有可用的信号(下面是在 Windows 上):

Signal.list
=> {"EXIT"=>0, "INT"=>2, "ILL"=>4, "ABRT"=>22, "FPE"=>8, "KILL"=>9, "SEGV"=>11, "TERM"=>15}

你能尝试通过例如 trap 它吗? INT(注意:每个信号可以有一个陷阱)(

Signal.trap('SEGV') { throw :sigsegv }

catch :sigsegv
start_what_you_need
end
puts 'OMG! Got a SEGV!'

由于你的问题很笼统,所以很难给你一个具体的答案。

关于ruby - 进程如何以 Process.wait 不会注意到的方式死亡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52545629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com