🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
1 messages
1 total messages Started by Marcin Lewandows Wed, 01 Sep 2010 13:46
Problem with ruby-dbus and subprocesses
#1274
Author: Marcin Lewandows
Date: Wed, 01 Sep 2010 13:46
96 lines
2494 bytes
Hi,

I am writing a system, where there are a few small, slave ruby scripts
doing something, spawned by master one.

I encountered propably a bug, and I don't know, how to solve it, so
please give me some help...

Please consider following script:

#!/usr/bin/ruby
require 'glib2'
require 'dbus'

bus = DBus::SessionBus.instance
bus.glibize
service = bus.request_service("dummy.test")

class DummyDBUS < DBus::Object
 dbus_interface "dummy.Test" do
   dbus_method :Shutdown do
     $mainloop.quit
   end

   dbus_method :Spawn do
     system("/bin/sh -c 'while [ 1 ]; do echo . >> /tmp/dot; sleep 1;
done &'")
   end
 end
end

$mainloop = GLib::MainLoop.new

dbus_object = DummyDBUS.new "Application"
service.export dbus_object

$mainloop.run


The idea is that I spawn a some subprocesses after receiving a command
via DBus. Later they communicate via DBus after slave subprocesses had
performed their tasks.

Unfortunately, Shutdown() command does not work if you previously
spawn any subprocesses using Spawn() command. It kills the master
process, but DBus does not release service name until it

I've check that it does not matter if they are spawned like

system("/bin/sh -c 'while [ 1 ]; do echo . >> /tmp/dot; sleep 1; done
&'")

or

exec("while [ 1 ]; do echo . >> /tmp/dot; sleep 1; done &") if
fork.nil?

or any other way to daemonize subprocess (I've tried also
Daemons.daemonize).

So the first test case is:

1. Spawn master script mentioned above.
2. Call Shutdown() method via DBus.
3. Works perfectly - master process is killed and removed from DBus'
service list.

Second test case is:

1. Spawn master script mentioned above.
2. Call Spawn() method via DBus.
3. Check, for sure, if subprocess works (tailf /tmp/dot) and if it's
separated from master process (e.g. pstree)
4. Call Shutdown() method via DBus.
5. Bug! Master process gets killed (mainloop is stopped) but service
name is not released in DBus until subprocess is killed.

Why?

It seems that some DBus messages are waiting until subprocess is
killed - it's easy to see with dbus-monitor. But how it's possible
that spawning a subprocess causes buffering those data? Is it a ruby
internal bug? Maybe ruby-dbus bug? dbus itself?

PS. I've checked that also without calling bus.glibize, with normal
loop - the same effect.
PS2. I use ubuntu 10.04,  ruby 1.8.7 (2010-01-10 patchlevel 249),
libdbus-ruby 0.4.0, libglib2-ruby1.8 0.19.3-1ubuntu3

I appreciate any help or directions,

thank you in advance,

--
Marcin

Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads