Ruby 红宝石中的setrlimit

Ruby 红宝石中的setrlimit,ruby,systems-programming,Ruby,Systems Programming,我试图使用以下代码限制ruby进程的执行时间: trap("XCPU") do abort "Max Time exceeded" end Process.setrlimit(:CPU, 5) loop do end 进程确实结束了,但陷阱代码没有运行(我只是在命令行上被“杀死”)。但是,当我将硬限制设置为大于5的值时,陷阱代码将运行 trap("XCPU") do abort "Max Time exceeded" end Process.setrlimit(:CPU, 5,

我试图使用以下代码限制ruby进程的执行时间:

trap("XCPU") do
  abort "Max Time exceeded"
end

Process.setrlimit(:CPU, 5)

loop do

end
进程确实结束了,但陷阱代码没有运行(我只是在命令行上被“杀死”)。但是,当我将硬限制设置为大于5的值时,陷阱代码将运行

trap("XCPU") do
  abort "Max Time exceeded"
end

Process.setrlimit(:CPU, 5, 6)

loop do

end
为什么第一个代码不工作?

XCPU信号(
SIGXCPU
)仅在软限制下发送。当达到硬限制时,将发送终止信号(
SIGKILL
)。终止信号导致程序立即终止,并且无法捕获

摘自:

XCPU信号在某个进程耗尽CPU一段时间后发送到该进程 超过某个预定用户可设置值的持续时间。这个 XCPU信号的到达为接收过程提供了 快速保存任何中间结果,并在 它由操作系统使用SIGKILL信号终止

KILL信号被发送到进程以使其终止 马上。与SIGTERM和SIGINT相反,此信号不能 捕获或忽略,并且接收进程无法执行任何 收到此信号后进行清理

通过不使用第二个参数调用,硬限制默认等于软限制。因此,至少在您的操作系统上,
SIGKILL
似乎是在
SIGXCPU
可由
trap
块处理之前发送的

下面是一个快速演示,说明第二种方法始终有效的原因:

t = Time.now
trap("XCPU") do
  abort "Max Time exceeded. Total running time: #{(Time.now - t).round} seconds"
end

Process.setrlimit(:CPU, 2, 5)

loop do
end

# => "Max Time exceeded. Total running time: 2 seconds"
在执行
陷阱
块之前未达到硬限制,因此代码按预期运行。

仅在软限制时发送XCPU信号(
SIGXCPU
)。当达到硬限制时,将发送终止信号(
SIGKILL
)。终止信号导致程序立即终止,并且无法捕获

摘自:

XCPU信号在某个进程耗尽CPU一段时间后发送到该进程 超过某个预定用户可设置值的持续时间。这个 XCPU信号的到达为接收过程提供了 快速保存任何中间结果,并在 它由操作系统使用SIGKILL信号终止

KILL信号被发送到进程以使其终止 马上。与SIGTERM和SIGINT相反,此信号不能 捕获或忽略,并且接收进程无法执行任何 收到此信号后进行清理

通过不使用第二个参数调用,硬限制默认等于软限制。因此,至少在您的操作系统上,
SIGKILL
似乎是在
SIGXCPU
可由
trap
块处理之前发送的

下面是一个快速演示,说明第二种方法始终有效的原因:

t = Time.now
trap("XCPU") do
  abort "Max Time exceeded. Total running time: #{(Time.now - t).round} seconds"
end

Process.setrlimit(:CPU, 2, 5)

loop do
end

# => "Max Time exceeded. Total running time: 2 seconds"

在执行
陷阱
块之前未达到硬限制,因此代码按预期运行。

这很奇怪,因为在我的Mac OS中,两个代码都按预期运行。你在用什么操作系统?我正在运行代码,他们在他们的(虚拟)机器上使用ubuntu。这很奇怪,因为在我的Mac操作系统中,两个代码都按预期运行。你在用什么操作系统?我正在运行代码,他们在他们的(虚拟)机器上使用ubuntu。回答很好,希望他们在ruby文档中提到。回答很好,希望他们在ruby文档中提到。