system waiting for launched process AND forked processes

Discussion in 'Ruby' started by Pierre Morel, Feb 17, 2010.

  1. Pierre Morel

    Pierre Morel Guest

    Hello,

    We have written a small client-server program in c/socket. To launch the
    server, we call the program which internally fork. The original process
    returns immediately but the forked process stays alive and listen to
    incoming socket connection.
    It's all fine when running this from bash (we're on ubuntu) but when
    using ruby (with either system, backtick or #x) it's blocking until both
    the original process and the forked process terminate.

    Is it what we should expect when calling system? If yes, how could we
    work around that?

    Thanks
    --
    Posted via http://www.ruby-forum.com/.
    Pierre Morel, Feb 17, 2010
    #1
    1. Advertising

  2. Pierre Morel

    Roger Pack Guest


    > It's all fine when running this from bash (we're on ubuntu) but when
    > using ruby (with either system, backtick or #x) it's blocking until both
    > the original process and the forked process terminate.
    >
    > Is it what we should expect when calling system? If yes, how could we
    > work around that?


    Mine doesn't seem to do that.

    rdp@li49-39:~$ cat spawn.rb
    Process.fork {
    puts 'in daemon'
    puts Process.pid
    sleep
    }
    puts 'terminating'

    rdp@li49-39:~$ cat spawn2.rb
    system("~/installs/ruby_trunk_installed/bin/ruby spawn.rb")
    puts 'done'

    rdp@li49-39:~$ ruby -v spawn2.rb
    ruby 1.8.6 (2009-3-4 mbari 8B/0x8770 on patchlevel 287) [i686-linux]
    terminating
    done
    in daemon
    3199
    rdp@li49-39:~$ ps -ef | grep 3199
    rdp 3199 1 0 17:41 pts/0 00:00:00
    /home/rdp/installs/ruby_trunk_installed/bin/ruby spawn.rb
    rdp 3272 477 0 17:41 pts/0 00:00:00 grep 3199


    (3199 is still alive).

    Perhaps your other process.wait'ing on the first or something?

    One thing that might help (in 1.9)
    Process.daemon {
    # something
    }

    or

    Process.fork {
    Thread.new { system("long running command")}
    }

    or what not.

    GL.
    -rp
    --
    Posted via http://www.ruby-forum.com/.
    Roger Pack, Feb 17, 2010
    #2
    1. Advertising

  3. On 02/17/2010 06:22 PM, Pierre Morel wrote:

    > We have written a small client-server program in c/socket. To launch the
    > server, we call the program which internally fork. The original process
    > returns immediately but the forked process stays alive and listen to
    > incoming socket connection.
    > It's all fine when running this from bash (we're on ubuntu) but when
    > using ruby (with either system, backtick or #x) it's blocking until both
    > the original process and the forked process terminate.
    >
    > Is it what we should expect when calling system? If yes, how could we
    > work around that?


    Hmmm, might be that you have an issue because your child's child is
    attached to your ruby process once the starter process stops. There is
    a whole range of other possible issues causing this which is hard to
    sort out given the little information we have. Did you take proper
    measures to demonize your child process after fork?

    Kind regards

    robert

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Feb 17, 2010
    #3
  4. On 02/17/2010 06:42 PM, Roger Pack wrote:

    > Process.fork {
    > Thread.new { system("long running command")}
    > }


    What do you create the thread for? Also exec is probably a better
    choice in this case.

    Kind regards

    robert

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Feb 17, 2010
    #4
  5. Pierre Morel

    Roger Pack Guest


    >> Process.fork {
    >> Thread.new { system("long running command")}
    >> }

    >
    > What do you create the thread for? Also exec is probably a better
    > choice in this case.


    ahh yes exec would work well.
    -r
    --
    Posted via http://www.ruby-forum.com/.
    Roger Pack, Feb 17, 2010
    #5
  6. Pierre Morel

    Pierre Morel Guest

    Robert Klemme wrote:
    >
    > Hmmm, might be that you have an issue because your child's child is
    > attached to your ruby process once the starter process stops. There is
    > a whole range of other possible issues causing this which is hard to
    > sort out given the little information we have. Did you take proper
    > measures to demonize your child process after fork?
    >
    > Kind regards
    >
    > robert


    I didn't take any measure to daemonize the child... Now I have done it
    (a call to setsid and few other things, I used the example at
    http://www-theorie.physik.unizh.ch/~dpotter/howto/daemonize) and it's
    working perfectly.

    My mistake was assume that it would work from ruby if it was working
    fine from the shell or even from another C++ program.

    Thank you very much for your quick response.

    Pierre
    --
    Posted via http://www.ruby-forum.com/.
    Pierre Morel, Feb 17, 2010
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Tim Uckun
    Replies:
    12
    Views:
    276
    Tim Uckun
    Oct 14, 2010
  2. Patrick Paquet
    Replies:
    3
    Views:
    131
    Patrick Paquet
    Jan 29, 2004
  3. Replies:
    2
    Views:
    133
  4. andrea crotti

    forked processes and testing

    andrea crotti, Sep 12, 2012, in forum: Python
    Replies:
    0
    Views:
    179
    andrea crotti
    Sep 12, 2012
  5. Kushal Kumaran

    Re: forked processes and testing

    Kushal Kumaran, Sep 12, 2012, in forum: Python
    Replies:
    0
    Views:
    176
    Kushal Kumaran
    Sep 12, 2012
Loading...

Share This Page