0

(スクリプトAPIを介して)いくつかのPERFORCE操作を実行し、単純に終了するrubyスクリプトがあります。

def foo()
  ...
end

def bar()
  ...
end

foo()
bar()
puts __LINE__
exit 0
#end of file

...そしてLINEが出力されている間、exit(0)が存在するかどうかに関係なく、プロセスは終了しません。これは主にMacではruby1.8.6ですが、PCでも見られます。

私はいつものグーグルを突っついていますが、ここで経験の声があるのではないかと期待しています。ありがとう。

4

1 に答える 1

1

私はPERFORCEにまったく精通していませんが、原因はat_exit何らかの理由でループに陥っているメソッドである可能性があります。irbたとえば、を使用して動作を観察します。

$ 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

at_exit関数がプロセスのハングを引き起こしているかどうかを確認するには、にフックしてみてくださいat_exit#{caller}は、誰が呼び出したかのスタックトレースを表示することに注意してください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

出力:

at_exit0が呼び出されました
at_exit1と呼ばれる
クリーニング...
at_exit2と呼ばれる
exitcheck.rb:14:in `do_cleanup'exitcheck.rb:18からat_exit#2を呼び出す
終了前のクリーンアップ...
exitcheck.rb:10からat_exit#1を呼び出す
私は出発しようとしています。
exitcheck.rb:9からat_exit#0を呼び出す
二度と戻らない

そして二度と戻らない。

于 2010-03-13T00:47:11.490 に答える