[Backgroundrb-devel] daemon use-case questions

Mike Dalessio mike at csa.net
Thu Jan 3 14:57:06 EST 2008

Hi all,

I'm trying to replace an OpenWFEru/daemons-based infrastructure, with the
goal being to be able to communicate with the workers to a) monitor current
state and to b) initiate new actions.

The short version on why these are daemons and not transient workers (that
start up and shut down when they're done with a particular task) is because
they're subscribing to an external pub/sub infrastructure, and are
aggregating data or monitoring the data around the clock.

I've been struggling for a few days now, and I'm hoping someone can point me
in the right direction, or else tell me that Backgroundrb isn't the right
tool for the job. My set of requirements that I'm having trouble with are
pretty straightforward, so I would think maybe someone else has run into
them. Here goes ...

1) I want to have separate log files for each daemon.

I've managed to accomplish this by setting the MetaWorker's @logger to an
instance of a proper Logger. I've also redirected STDOUT/STDERR by using
reopen(). Pow!

I'm worried, though -- isn't this going to break something? I haven't seen
anything that's obviously broken, but I'm only two days into the effort, and
only ankle-deep in the code. I need enlightenment.

2) I want to know if it dies, so that I can restart it and send myself an

With OpenWFEru I have a wrapper script which invokes the daemon via system()
and watches for unsuccessful exit codes. Is there an equivalent
best-practice for this in the BDRB universe?

3) I want to be able to shut down cleanly

Workers don't seem to be given the opportunity to shut down cleanly. I've
tried defining a SIGTERM handler, as well as redefining the terminate_me()
and shutdown() methods, but I can't get this to work. Anybody have any
guidance here?

4) I want to be able to monitor current status

After the pattern of Linux daemons, I'd like to be able to run
"./script/backgroundrb status" and get my status back. I can submit a patch
for this if anyone else is interested.

However, I noticed while writing that patch, that query_all_workers() seems
to be broken in the trunk r302 (status for all workers is always nil). So my
workaround for now is to use ask_status():

     t_response = MiddleMan.query_all_workers
     t_response.each {|k,v| puts "#{k}: #{MiddleMan.ask_status(:worker =>
k)}" }

Anyhoo, that's it. That really rambled on longer than I thought it would.
Please let me know if I can clarify any of my questions, and thanks to
everyone for their patience with my long-windedness.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/backgroundrb-devel/attachments/20080103/b7e6df2c/attachment-0001.html 

More information about the Backgroundrb-devel mailing list