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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top