Gmail Calendar Documents Reader Web more »
Recently Visited Groups | Help | Sign in
Google Groups Home
subprocess leaves child living
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  16 messages - Collapse all  -  Translate all to Translated (View all originals)
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Thomas Dybdahl Ahle  
View profile  
 More options Jun 5 2007, 9:58 pm
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Tue, 05 Jun 2007 13:58:46 +0200
Local: Tues, Jun 5 2007 9:58 pm
Subject: subprocess leaves child living
Hi, When I do a small program like

from subprocess import Popen
popen = Popen(["ping", "google.com"])
from time import sleep
sleep(100)

start it and kill it, the ping process lives on.
Is there a way to ensure that the ping process is always killed when the
python process is?
I can't use atexit, as ping then isn't killed when python is killed "in
the hard way"


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Stefan Sonnenberg-Carstens  
View profile  
 More options Jun 5 2007, 10:07 pm
Newsgroups: comp.lang.python
From: Stefan Sonnenberg-Carstens <stefan.sonnenb...@pythonmeister.com>
Date: Tue, 05 Jun 2007 14:07:44 +0200
Local: Tues, Jun 5 2007 10:07 pm
Subject: Re: subprocess leaves child living
Thomas Dybdahl Ahle schrieb:
> Hi, When I do a small program like

> from subprocess import Popen
> popen = Popen(["ping", "google.com"])
> from time import sleep
> sleep(100)

> start it and kill it, the ping process lives on.
> Is there a way to ensure that the ping process is always killed when the
> python process is?
> I can't use atexit, as ping then isn't killed when python is killed "in
> the hard way"

Calling popen.close() perhaps ?
You basically open a pipe, which spawns a shell and the command is then
started in there.
So, if your program quits, the spawned shell is still alive, only the
pipe is dead.

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Thomas Dybdahl Ahle  
View profile  
 More options Jun 5 2007, 11:15 pm
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Tue, 05 Jun 2007 15:15:42 +0200
Local: Tues, Jun 5 2007 11:15 pm
Subject: Re: subprocess leaves child living
Den Tue, 05 Jun 2007 14:07:44 +0200 skrev Stefan Sonnenberg-Carstens:

Problem is - I can't do that when I get killed.
Isn't it possible to open processes in such a way like terminals? If I
kill the terminal, everything open in it will die too.

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Rob Wolfe  
View profile  
 More options Jun 6 2007, 12:06 am
Newsgroups: comp.lang.python
From: Rob Wolfe <r...@smsnet.pl>
Date: Tue, 05 Jun 2007 07:06:15 -0700
Local: Wed, Jun 6 2007 12:06 am
Subject: Re: subprocess leaves child living

Thomas Dybdahl Ahle wrote:
> Problem is - I can't do that when I get killed.
> Isn't it possible to open processes in such a way like terminals? If I
> kill the terminal, everything open in it will die too.

On POSIX platform you can use signals and ``os.kill`` function.
Fo example:

<code>
import os, signal
from subprocess import Popen
from time import sleep

def handler(signum, frame):
    print 'Signal handler called'
    raise KeyboardInterrupt

signal.signal(signal.SIGTERM, handler)

try:
    popen = Popen(["ping", "google.com"])
    try:
        sleep(100)
    except KeyboardInterrupt:
        pass
finally:
    if popen.poll() is None:
        print "killing process: %d" % popen.pid
        os.kill(popen.pid, signal.SIGTERM)
</code>

--
HTH,
Rob


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Thomas Dybdahl Ahle  
View profile  
 More options Jun 6 2007, 1:15 am
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Tue, 05 Jun 2007 17:15:39 +0200
Local: Wed, Jun 6 2007 1:15 am
Subject: Re: subprocess leaves child living
Den Tue, 05 Jun 2007 07:06:15 -0700 skrev Rob Wolfe:

But you can't ever catch sigkill.
Isn't there a way to make sure the os kills the childprocess when the
parrent dies?

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Rob Wolfe  
View profile  
 More options Jun 6 2007, 6:01 am
Newsgroups: comp.lang.python
From: Rob Wolfe <r...@smsnet.pl>
Date: Tue, 05 Jun 2007 22:01:44 +0200
Local: Wed, Jun 6 2007 6:01 am
Subject: Re: subprocess leaves child living
Thomas Dybdahl Ahle <lob...@gmail.com> writes:

> But you can't ever catch sigkill.

There is no protection against sigkill.

> Isn't there a way to make sure the os kills the childprocess when the
> parrent dies?

If the parent dies suddenly without any notification childprocesses
become zombies and there is no way to avoid that.

--
HTH,
Rob


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Michael Bentley  
View profile  
 More options Jun 6 2007, 6:46 am
Newsgroups: comp.lang.python
From: Michael Bentley <mich...@jedimindworks.com>
Date: Tue, 5 Jun 2007 15:46:39 -0500
Local: Wed, Jun 6 2007 6:46 am
Subject: Re: subprocess leaves child living

On Jun 5, 2007, at 3:01 PM, Rob Wolfe wrote:

> Thomas Dybdahl Ahle <lob...@gmail.com> writes:

>> But you can't ever catch sigkill.

> There is no protection against sigkill.

>> Isn't there a way to make sure the os kills the childprocess when the
>> parrent dies?

> If the parent dies suddenly without any notification childprocesses
> become zombies and there is no way to avoid that.

Apologies for picking nits...

But actually *that* is an orphan process.  When a parent process dies  
and the child continues to run, the child becomes an orphan and is  
adopted by init.  Orphan processes can be cleaned up on most Unices  
with 'init q' (or something very similar).

Zombies on the other hand, are those processes that have completed  
execution but still have an entry in the process table.  The cause of  
zombies AFAIK, is a parent that has failed to call wait(2).  To clean  
up zombies, you can send a SIGCHLD signal to the parent process --  
probably with 'kill -17' (but use 'kill -l' to find out what it is on  
your system).

hth,
Michael
---
"I would rather use Java than Perl. And I'd rather be eaten by a  
crocodile than use Java." — Trouser


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Thomas Dybdahl Ahle  
View profile  
 More options Jun 6 2007, 7:15 am
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Tue, 05 Jun 2007 23:15:30 +0200
Local: Wed, Jun 6 2007 7:15 am
Subject: Re: subprocess leaves child living
Den Tue, 05 Jun 2007 22:01:44 +0200 skrev Rob Wolfe:

> Thomas Dybdahl Ahle <lob...@gmail.com> writes:

>> But you can't ever catch sigkill.

> There is no protection against sigkill.

>> Isn't there a way to make sure the os kills the childprocess when the
>> parrent dies?

> If the parent dies suddenly without any notification childprocesses
> become zombies and there is no way to avoid that.

If I call "kill -9 pythonpid" on the python code you posted earlier, the
terminal running the script will continue pinging forever.
If it was a harder program like a chessengine or such, it would continue
consuming 100% cpu time.
Zombies would be fine to me.

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Thomas Dybdahl Ahle  
View profile  
 More options Jun 6 2007, 7:17 am
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Tue, 05 Jun 2007 23:17:47 +0200
Local: Wed, Jun 6 2007 7:17 am
Subject: Re: subprocess leaves child living
Den Tue, 05 Jun 2007 15:46:39 -0500 skrev Michael Bentley:

> But actually *that* is an orphan process.  When a parent process dies
> and the child continues to run, the child becomes an orphan and is
> adopted by init.  Orphan processes can be cleaned up on most Unices with
> 'init q' (or something very similar).

Is it not possible to tell python that this process should not be adopted
by init, but die with its parrent?
Just like terminals seem to do it..

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Michael Bentley  
View profile  
 More options Jun 6 2007, 8:13 am
Newsgroups: comp.lang.python
From: Michael Bentley <mich...@jedimindworks.com>
Date: Tue, 5 Jun 2007 17:13:43 -0500
Local: Wed, Jun 6 2007 8:13 am
Subject: Re: subprocess leaves child living

On Jun 5, 2007, at 4:17 PM, Thomas Dybdahl Ahle wrote:

> Den Tue, 05 Jun 2007 15:46:39 -0500 skrev Michael Bentley:

>> But actually *that* is an orphan process.  When a parent process dies
>> and the child continues to run, the child becomes an orphan and is
>> adopted by init.  Orphan processes can be cleaned up on most  
>> Unices with
>> 'init q' (or something very similar).

> Is it not possible to tell python that this process should not be  
> adopted
> by init, but die with its parrent?
> Just like terminals seem to do it..

Well, the way you posed the original question:

> from subprocess import Popen
> popen = Popen(["ping", "google.com"])
> from time import sleep
> sleep(100)

is really what adoption by init is designed to handle. Here you've  
created a child but have not waited for its return value.  Like a  
good adoptive parent, init will wait(2) for the child.

I think if you really looked into it you'd find that the terminal had  
called wait(2) before it was killed.  Similarly, if you start a long-
running subprocess in python and wait for it to return -- killing the  
parent will slaughter the child as well.

hth,
Michael
---
Let the wookie win.


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Michael Bentley  
View profile  
 More options Jun 6 2007, 8:41 am
Newsgroups: comp.lang.python
From: Michael Bentley <mich...@jedimindworks.com>
Date: Tue, 5 Jun 2007 17:41:47 -0500
Local: Wed, Jun 6 2007 8:41 am
Subject: Re: subprocess leaves child living

On Jun 5, 2007, at 5:13 PM, Michael Bentley wrote:

I guess I should have verified my suspicions before speaking up -- I  
was worng -- even if you are waiting for a return code, the child  
will persist as a child of init.

regards,
Michael
---
The Rules of Optimization are simple.
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.
                                  -Michael A. Jackson


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Nick Craig-Wood  
View profile  
 More options Jun 6 2007, 3:33 pm
Newsgroups: comp.lang.python
From: Nick Craig-Wood <n...@craig-wood.com>
Date: Wed, 06 Jun 2007 00:33:30 -0500
Local: Wed, Jun 6 2007 3:33 pm
Subject: Re: subprocess leaves child living
Thomas Dybdahl Ahle <lob...@gmail.com> wrote:

>  But you can't ever catch sigkill.
>  Isn't there a way to make sure the os kills the childprocess when the
>  parrent dies?

Not as far as I know.

If you've got a pipe open to the child then killing the parent should
deliver SIGPIPE to the child which may (or may not) kill it.  At least
it got some sort of notification.

--
Nick Craig-Wood <n...@craig-wood.com> -- http://www.craig-wood.com/nick


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Thomas Dybdahl Ahle  
View profile  
 More options Jun 6 2007, 10:11 pm
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Wed, 06 Jun 2007 14:11:01 +0200
Local: Wed, Jun 6 2007 10:11 pm
Subject: Re: subprocess leaves child living
Den Tue, 05 Jun 2007 17:41:47 -0500 skrev Michael Bentley:

Bugger.
I know that if you use forkpty, the child get slaughtered, but using the
subprocess module just seems much easier than forking.

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Michael Bentley  
View profile  
 More options Jun 6 2007, 10:44 pm
Newsgroups: comp.lang.python
From: Michael Bentley <mich...@jedimindworks.com>
Date: Wed, 6 Jun 2007 07:44:03 -0500
Local: Wed, Jun 6 2007 10:44 pm
Subject: Re: subprocess leaves child living

On Jun 6, 2007, at 7:11 AM, Thomas Dybdahl Ahle wrote:

Yeah, and if there is some way (there may be, but I don't know) to  
make your python script the head of a process group (or session --  
I'm not very clear on the distinction) -- children would be  
automatically slain.  That's how a terminal session manages to get  
its children cleaned up I think...

If it is important that children get terminated upon death of a  
parent, you probably do have to fork.

g'luck!
Michael
---
"Neurons are far more valuable than disk space, screen lines, or CPU  
cycles." - Ben Finney


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
reed  
View profile  
 More options Jun 7 2007, 5:00 pm
Newsgroups: comp.lang.python
From: reed <reedobr...@gmail.com>
Date: Thu, 07 Jun 2007 07:00:53 -0000
Local: Thurs, Jun 7 2007 5:00 pm
Subject: Re: subprocess leaves child living
On Jun 5, 7:58 am, Thomas Dybdahl Ahle <lob...@gmail.com> wrote:

> Hi, When I do a small program like

> from subprocess import Popen
> popen = Popen(["ping", "google.com"])
> from time import sleep
> sleep(100)

> start it and kill it, the ping process lives on.
> Is there a way to ensure that the ping process is always killed when the
> python process is?
> I can't use atexit, as ping then isn't killed when python is killed "in
> the hard way"

pid = popen.pid
pidfile = open('/usr/local/var/somefile.pid', 'w')
pidfile.write('pid')
pidfile.close()

then you can check if it is still running when your ?program? restarts
and can kill it.

maybe not the perfect answer, but it answers an imperfect question.


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Thomas Dybdahl Ahle  
View profile  
 More options Jun 7 2007, 11:48 pm
Newsgroups: comp.lang.python
From: Thomas Dybdahl Ahle <lob...@gmail.com>
Date: Thu, 07 Jun 2007 15:48:51 +0200
Local: Thurs, Jun 7 2007 11:48 pm
Subject: Re: subprocess leaves child living
Den Thu, 07 Jun 2007 07:00:53 +0000 skrev reed:

If it restarts yeah.

> maybe not the perfect answer, but it answers an imperfect question.

Any details you need?

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
End of messages
« Back to Discussions « Newer topic     Older topic »

Create a group - Google Groups - Google Home - Terms of Service - Privacy Policy
©2009 Google