这是我写的一些代码的简化版本:
class InfiniteLoop
def run
trap('SIGTERM') do
puts 'exiting'
exit
end
loop {}
end
end
如果我跑:
InfiniteLoop.new.run
我可以ctrl+c
并获得:
exiting
然而,当我这样做时:
t = Thread.new { InfiniteLoop.new.run }
sleep 1
t.terminate
我没看到:
exiting
有人能指出我在正确的方向吗?我想在终止线程时有相同的行为。
答案 0 :(得分:5)
如果您没有发送SIGTERM信号(通过ctrl + c),则不会执行陷阱块。 另请参阅内核方法:
at_exit { puts 'exiting' }
答案 1 :(得分:3)
trap('SIGTERM')
只会响应从操作系统发送的信号。
Thread#terminate
是会破坏线程的ruby代码。
我不知道在线程被杀死之前指定线程的行为的方法。这可能很有趣。但我不认为它存在,因为Thread#kill/terminate/join
的语义不会真正允许它。
答案 2 :(得分:0)
试试trap("EXIT")
。 SIGTERM由ctrl-C或kill命令发送。来自ruby docs:
特殊信号名称“EXIT”或信号编号0将在程序终止之前调用。