Ce qui pourrait provoquer des rubis verrouillera en sortant?
Question
J'ai un script Ruby qui fait quelques opérations de Perforce (via l'API de script), puis se termine simplement:
def foo()
...
end
def bar()
...
end
foo()
bar()
puts __LINE__
exit 0
#end of file
... et alors que le LIGNE imprimera, le processus ne se termine jamais, si la sortie (0) est là ou non. Ce rubis 1.8.6, principalement sur le mac, mais je vois cela sur le PC ainsi.
Je fais Google habitude farfouillé, mais espéré qu'il pourrait y avoir une voix d'expérience ici à la banque sur. Merci.
La solution
Je ne suis pas du tout familier avec Perforce, mais le coupable pourrait être un méthode at_exit
qui est bloqué dans une boucle pour une raison quelconque. Observer le comportement à l'aide irb
, par exemple:
$ 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
Pour vérifier si une fonction at_exit
est à l'origine du processus pour accrocher, vous pouvez accrocher dans at_exit
. Notez que le #{caller}
affiche la trace de la pile de qui a appelé 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
sorties qui:
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
et ne retourne jamais.