473,409 Members | 2,006 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,409 software developers and data experts.

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"
Jun 5 '07 #1
15 17494
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.
Jun 5 '07 #2
Den Tue, 05 Jun 2007 14:07:44 +0200 skrev Stefan Sonnenberg-Carstens:
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.
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.
Jun 5 '07 #3

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

Jun 5 '07 #4
Den Tue, 05 Jun 2007 07:06:15 -0700 skrev Rob Wolfe:
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>
But you can't ever catch sigkill.
Isn't there a way to make sure the os kills the childprocess when the
parrent dies?
Jun 5 '07 #5
Thomas Dybdahl Ahle <lo****@gmail.comwrites:
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
Jun 5 '07 #6

On Jun 5, 2007, at 3:01 PM, Rob Wolfe wrote:
Thomas Dybdahl Ahle <lo****@gmail.comwrites:
>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
Jun 5 '07 #7
Den Tue, 05 Jun 2007 22:01:44 +0200 skrev Rob Wolfe:
Thomas Dybdahl Ahle <lo****@gmail.comwrites:
>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.
Jun 5 '07 #8
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..
Jun 5 '07 #9

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.

Jun 5 '07 #10

On Jun 5, 2007, at 5:13 PM, Michael Bentley wrote:
>
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.
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
Jun 5 '07 #11
Thomas Dybdahl Ahle <lo****@gmail.comwrote:
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 <ni**@craig-wood.com-- http://www.craig-wood.com/nick
Jun 6 '07 #12
Den Tue, 05 Jun 2007 17:41:47 -0500 skrev Michael Bentley:
On Jun 5, 2007, at 5:13 PM, Michael Bentley wrote:

>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.

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.
Bugger.
I know that if you use forkpty, the child get slaughtered, but using the
subprocess module just seems much easier than forking.
Jun 6 '07 #13

On Jun 6, 2007, at 7:11 AM, Thomas Dybdahl Ahle wrote:
Den Tue, 05 Jun 2007 17:41:47 -0500 skrev Michael Bentley:
>On Jun 5, 2007, at 5:13 PM, Michael Bentley wrote:

>>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.

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.

Bugger.
I know that if you use forkpty, the child get slaughtered, but
using the
subprocess module just seems much easier than forking.
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


Jun 6 '07 #14
On Jun 5, 7:58 am, Thomas Dybdahl Ahle <lob...@gmail.comwrote:
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.

Jun 7 '07 #15
Den Thu, 07 Jun 2007 07:00:53 +0000 skrev reed:
On Jun 5, 7:58 am, Thomas Dybdahl Ahle <lob...@gmail.comwrote:
>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.
If it restarts yeah.
maybe not the perfect answer, but it answers an imperfect question.
Any details you need?
Jun 7 '07 #16

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Robin Becker | last post by:
After struggling with os.spawnxxx to get a detached process I tried using Pyhton2.4's new subprocess module. I struggled with that as well even when trying to use the creation flags for...
5
by: Robin Becker | last post by:
There seems to be a problem with calling subprocesses from a script run with pythonw rather than python. The error doesn't seem to be a function of using pythonw.exe rather than python.exe in the...
2
by: MrEntropy | last post by:
Greetings, I'm having a little trouble getting an idea running. I am writing a C program which is really a frontend to a Python program. Now, my C program starts up, does some initialisation like...
2
by: Greg Ercolano | last post by:
When I use os.popen(cmd,'w'), I find that under windows, the stdout of the child process disappears, instead of appearing in the DOS window the script is invoked from. eg: C:\type foo.py import...
9
by: Phoe6 | last post by:
Hi all, Consider this scenario, where in I need to use subprocess to execute a command like 'ping 127.0.0.1' which will have a continuous non- terminating output in Linux. # code # This...
4
by: 7stud | last post by:
Hi, What is the difference between: 1) getting the returncode directly from the subprocess object 2) calling poll() on the subprocess object? Here is an example:
12
by: bhunter | last post by:
Hi, I've used subprocess with 2.4 several times to execute a process, wait for it to finish, and then look at its output. Now I want to spawn the process separately, later check to see if it's...
7
by: Samuel A. Falvo II | last post by:
I have a shell script script.sh that launches a Java process in the background using the &-operator, like so: #!/bin/bash java ... arguments here ... & In my Python code, I want to invoke...
2
by: Chuckk Hubbard | last post by:
If I run 'python -i subprocessclient.py' I expect to see the nice level of it go up 2, and the nice level of the subprocess go up 1. But all I see is the nice level of the client change. What am I...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.