Hi, in my customized "unicorn" executable I create N forks in master process to behave as posix_mq readers. I added a "at_exit" block just in master process so they are killed when the master receives a signal to terminate. The only issue I''m experimenting is the fact that they are not killed if the master process receives a KILL signal. However Unicorn workers are terminated after master is killed with KILL signal. Could I know how such cool feature is implemented? AFAIK when a process receives a KILL signal it just dies and cannot capture such signal so this should be a feature implemented in workers (in some way they can detect if master has died, am I right?). If so, could I be pointed to the exact code in which the feature is implemented? I would like to replicate it in my extra-processes. Thanks a lot. -- I?aki Baz Castillo <ibc at aliax.net>
I?aki Baz Castillo <ibc at aliax.net> wrote:> Hi, in my customized "unicorn" executable I create N forks in master process > to behave as posix_mq readers. > > I added a "at_exit" block just in master process so they are killed when the > master receives a signal to terminate. > > The only issue I''m experimenting is the fact that they are not killed if the > master process receives a KILL signal. However Unicorn workers are terminated > after master is killed with KILL signal. Could I know how such cool feature is > implemented? > > AFAIK when a process receives a KILL signal it just dies and cannot capture > such signal so this should be a feature implemented in workers (in some way > they can detect if master has died, am I right?). If so, could I be pointed to > the exact code in which the feature is implemented? I would like to replicate > it in my extra-processes. >Hi I?aki, The worker_loop just compares Process.ppid with the original ppid it was started with. They wakeup from IO.select() every timeout/2 seconds to check for original_ppid != ppid if the server is idle. -- Eric Wong
El S?bado, 9 de Enero de 2010, Eric Wong escribi?:> The worker_loop just compares Process.ppid with the original ppid it > was started with. They wakeup from IO.select() every timeout/2 seconds > to check for original_ppid != ppid if the server is idle.Thanks, I was expecting exactly that as the ppid changes when the master process dies :) -- I?aki Baz Castillo <ibc at aliax.net>
El S?bado, 9 de Enero de 2010, I?aki Baz Castillo escribi?:> El S?bado, 9 de Enero de 2010, Eric Wong escribi?: > > The worker_loop just compares Process.ppid with the original ppid it > > was started with. They wakeup from IO.select() every timeout/2 seconds > > to check for original_ppid != ppid if the server is idle. > > Thanks, I was expecting exactly that as the ppid changes when the master > process dies :)I''ve implememented the same concept for my extra-processes in a similar way: ppid = Process.ppid Thread.new do loop do sleep 4 if Process.ppid != ppid log.fatal "master process did, exiting" exit! end end end -- I?aki Baz Castillo <ibc at aliax.net>