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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top