From: Daniel Berger Date: 2008-04-16T02:29:01+09:00 Subject: Re: at_exit handlers and Process.kill Ken Bloom wrote: > On Tue, 15 Apr 2008 11:28:33 -0500, Daniel Berger wrote: > >> ts wrote: >>> Daniel Berger wrote: >>>> # process_test.rb >>>> File.open("pid.txt", "w"){ |fh| fh.print Process.pid } p Process.pid >>>> >>>> sleep 1 while true >>> you really think that the following line will be executed ? >> Why not? The docs say at_exit, "Converts block to a Proc object (and >> therefore binds it at the point of call), and registers it for execution >> when the program exits." > > Ruby does *everything* in the order it encounters it in the file. > at_exit installs an exit handler, (a proc to be run later) but it's a > method that has to be executed. If you put "sleep 1 while true" before > the at_exit call, the at_exit call will never be executed, so the exit > handler will never be installed. Adjust your program to call at_exit (or > whatever other handlers you want) before running anything else. > > # process_test.rb > at_exit { > puts "AT_EXIT" > } > > END{ > puts "END" > } > > trap("KILL"){ > puts "KILLED" > } > > > File.open("pid.txt", "w"){ |fh| fh.print Process.pid } > p Process.pid > > sleep 1 while true Right, I should have clarified that, even with the right ordering, at_exit and END blocks weren't called. Perhaps it's the signal I used? I haven't fully experimented yet... Regards, Dan