Was könnte Rubin verursachen beim Beenden einzusperren?
Frage
Ich habe einen Ruby-Skript, das ein paar notgedrungen Operationen hat (durch den Skript-API), dann einfach beendet:
def foo()
...
end
def bar()
...
end
foo()
bar()
puts __LINE__
exit 0
#end of file
... und während der LINE wird ausdrucken, der Prozess endet nie, ob der Ausgang (0) ist es oder nicht. Dies ist Rubin 1.8.6, in erster Linie auf dem Mac, aber ich dies auch auf dem PC zu sehen.
Ich mache das übliche Google stochert, hoffte aber es könnte eine Stimme der Erfahrung, hier zu Bank auf. Danke.
Lösung
Ich bin nicht vertraut mit notgedrungen, aber der Täter könnte ein at_exit
Verfahren, dass die in einer Schleife aus irgendeinem Grund stecken. Beobachten Sie das Verhalten mit irb
, zum Beispiel:
$ 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
, um zu bestätigen, ob eine at_exit
Funktion, den Prozess zu hängen verursacht, können Sie versuchen, in at_exit
Einhaken. Beachten Sie, dass der #{caller}
den Stack-Trace angezeigt werden, die genannt 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
die Ausgänge:
at_exit 0 called at_exit 1 called Cleaning... at_exit 2 called Calling at_exit #2 from exitcheck.rb:14:in `do_cleanup'exitcheck.rb:18 Cleaning up before exit... Calling at_exit #1 from exitcheck.rb:10 I am about to leave. Calling at_exit #0 from exitcheck.rb:9 I'll never return
und nie zurückkehrt.