Cosa potrebbe causare il blocco di Ruby durante l'uscita?
Domanda
Ho uno script Ruby che esegue alcune operazioni forzate (tramite l'API di scripting) quindi termina semplicemente:
def foo()
...
end
def bar()
...
end
foo()
bar()
puts __LINE__
exit 0
#end of file
...e mentre il LINEA verrà stampato, il processo non termina mai, indipendentemente dal fatto che exit(0) sia presente o meno.Questo è Ruby 1.8.6, principalmente su Mac, ma lo vedo anche su PC.
Sto facendo la solita ricerca su Google, ma spero che qui ci sia una voce esperta su cui contare.Grazie.
Soluzione
Non ho alcuna familiarità con Perforce, ma il colpevole potrebbe essere un at_exit
metodo che per qualche motivo è bloccato in un loop.Osservare il comportamento utilizzando irb
, ad esempio:
$ 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
Per confermare se un at_exit
sta causando il blocco del processo, puoi provare ad collegarti at_exit
.Si noti che il #{caller}
visualizzerà lo stack trace di chi ha chiamato 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
che restituisce:
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
e non ritorna mai.