Ruby 红宝石中的setrlimit
我试图使用以下代码限制ruby进程的执行时间: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,
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文档中提到。