0

我有一个 ruby​​ 脚本,它执行一些 perforce 操作(通过脚本 API)然后简单地结束:

def foo()
  ...
end

def bar()
  ...
end

foo()
bar()
puts __LINE__
exit 0
#end of file

...虽然LINE将打印出来,但无论 exit(0) 是否存在,该过程都不会结束。这是 ruby​​ 1.8.6,主要在 mac 上,但我也在 PC 上看到了这个。

我正在做通常的谷歌搜索,但希望这里可能有经验的声音可以依靠。谢谢。

4

1 回答 1

1

我对 perforce 一点也不熟悉,但罪魁祸首可能是一种at_exit由于某种原因陷入循环的方法。使用 观察行为irb,例如:

$ irb
irb(main):001:0> require 'time'
=> true
irb(main):002:0> at_exit { puts Time.now; sleep 10; puts Time.now }
=> #<Proc:0xb7656f64@(irb):2>
irb(main):003:0> exit
Fri Mar 12 19:46:25 -0500 2010
Fri Mar 12 19:46:35 -0500 2010

要确认某个at_exit函数是否导致进程挂起,您可以尝试挂钩到at_exit. 请注意,#{caller}将显示调用者的堆栈跟踪at_exit

def at_exit &block
    @at_exit_counter ||= 0
    puts "at_exit #{@at_exit_counter} called"
    s = "Calling at_exit ##{@at_exit_counter} from #{caller}"
    super { puts s; block.call() }
    @at_exit_counter += 1
end

at_exit { puts "I'll never return"; sleep 1 while true; }
at_exit { puts 'I am about to leave.' }

def do_cleanup
    puts "Cleaning..."
    at_exit { puts 'Cleaning up before exit...' }

end

do_cleanup

输出:

at_exit 0 调用
at_exit 1 调用
打扫...
at_exit 2 调用
从 exitcheck.rb:14:in `do_cleanup'exitcheck.rb:18 调用 at_exit #2
出门前清理...
从 exitcheck.rb:10 调用 at_exit #1
我要离开了。
从 exitcheck.rb:9 调用 at_exit #0
我永远不会回来

并且永远不会回来。

于 2010-03-13T00:47:11.490 回答