Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Killing sons (Linux)

Reply
Thread Tools

Killing sons (Linux)

 
 
Ohad Lutzky
Guest
Posts: n/a
 
      05-28-2007
Maybe this isn't strictly a Ruby question, but I hope someone here can
help:

I have a job-management application, with a central daemon which
receives job requests. Upon receiving this request, it forks and then
runs "system" to run bash, which in turn runs the Matlab job. I use bash
for this in order to redirect the input and output from Matlab. pstree
output looks like this:

init-+-apache2---8*[apache2]
|-atd
...
|-ruby-+-4*[ruby---bash---MATLAB-+-matlab_helper]
| | `-15*[{MATLAB}]]
| `-{ruby}
...

Legend:
daemon ^ ^ daemon fork

Now, my system also allows a 'kill' command, intended to stop the job in
progress. This has been causing me a lot of trouble, and I suddenly
(after quite a while the system has been in production, how embarassing)
realized why - the PID I'm keeping is of the daemon fork. Killing it
doesn't kill all of its sons - it causes bash to get reparented to init!

Any idea of a clean, quick way to fix this?

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Ohad Lutzky
Guest
Posts: n/a
 
      05-28-2007
Francis Cianfrocca wrote:
> On 5/28/07, Ohad Lutzky <(E-Mail Removed)> wrote:
>>
>>
>> Now, my system also allows a 'kill' command, intended to stop the job in
>> progress. This has been causing me a lot of trouble, and I suddenly
>> (after quite a while the system has been in production, how embarassing)
>> realized why - the PID I'm keeping is of the daemon fork. Killing it
>> doesn't kill all of its sons - it causes bash to get reparented to init!
>>
>> Any idea of a clean, quick way to fix this?

>
>
>
> Make your parent process the leader of its own process group with
> setpgid(0,0). When you fork, add each child to the parent's process
> group
> with setpgid(0, getppid()). If you fork subchildren, make sure they get
> added to the same process group. Now, to send a signal to the whole
> group,
> send it to (0 - pid), where pid is that of the parent. If you want them
> all
> to die without killing the leader, use a signal whose default behavior
> is
> terminate-process and ignore it in the parent.


Just to be sure - if I run the following Ruby code on a Linux system:

child = fork do
Process::setpgid 0,0
system 'bash -c "sleep 300"'
end
Process::kill 9, -child

Then I am guaranteed that no child bash, sleep or ruby process will
remain? It works, I just want to be sure I can count on that behaviour.
For contrast, in my original code, bash gets reparented to init:

child = fork do
system 'bash -c "sleep 300"'
end
Process::kill 9, child

And this code doesn't even work (ESRCH: No such process)

child = fork do
system 'bash -c "sleep 300"'
end
Process::kill 9, -child

Thank you for your help!

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Ohad Lutzky
Guest
Posts: n/a
 
      05-30-2007
I've learned how to do redirection from within ruby
($stdwhatever.reopen), and switched to using exec instead of system - so
now I avoid two levels of depth. I also use setpgid and kill the whole
group for good measure.

Much thanks for your help!

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Has anyone tried the new version of Sons of Anarchy? Jyoti Ballabh Gaming 0 11-26-2009 07:21 PM
Killing The "Double Download" Box--Need Help Please Ducati@Darmah.net Firefox 2 05-05-2005 12:29 AM
Killing processes in CatOS Arnold Nipper Cisco 0 01-12-2005 05:33 PM
killing a lingering VPN connection Eric Sabine Cisco 0 06-03-2004 03:04 PM
Help with my sons (ADVICE NEEDED) Barbara Kevscave Digital Photography 9 05-21-2004 02:53 AM



Advertisments