how to kill a process

James T. Dennis jadestar at idiom.com
Wed Jun 13 03:29:43 CEST 2007


Richard Rossel <henhiskan at gmail.com> wrote:
> Hi Fellows,
> I have a problem with process termination. I have a python code that
> apache runs through a django interface.
> The code is very simple, first, it creates a process with the
> subprocess.Popen call, and afterwards, (using a web request) the
> python code uses the PID of the previously created process(stored in a
> db) and kills it with an os.kill call using the SIGKILL signal.

> The creation of the process is ok, apache calls the python code, this
> code creates the process and exits leaving the process up and
> running :)
> But when the python code is called to kill the created process, the
> process is left in a zombie state.

 A zombie is an entry in the process table that stores the exit value
 of a deceased process.  (The word is a bit of a misnomer ... and
 the better term would be "death certificate").

 You want to do an os.wait() to clear that entry.

 (The process is well and truly dead after this sort of os.kill()
 but the system still wants the parent process to be able to retrieve
 the exit value  and this is the Unix/Linux mechanism for storing that).

> The kill code that I'm using is:
> os.kill(pid, signal.SIGKILL)

> and I also tried:
> kill_proc = Popen("kill -9 " + pid, shell=true)
> but with no success.

 The misunderstanding here is that you *were* successful.
 You have killed the process.  It's dead.  Nothing's left but
 a death certificate (or "gravestone" or "corpse" or whatever
 you want to call it).  All that remains is for the parent to
 drop by the morgue (the process table) and pick up the remains.

> I suppose that the reason maybe that the python code exits before the
> kill call has finished,
> so I tried with a while loop until kill_proc.poll() != None, but
> without success too :(

> do you know what is what I'm doing wrong?

 You are fundamentally misunderstanding the nature of the process
 table and the meaning of "zombie."  Don't feel bad.  It's a very
 common misunderstanding which has sadly been very poorly addressed
 by books on Unix systems administration and programming.

> thanks very much.-

 Glad to help.  Try this:

	os.kill(pid, signal.SIGKILL)
	killedpid, stat = os.waitpid(pid, os.WNOHANG)
	if killedpid == 0:
		print >> sys.stderr, "ACK! PROCESS NOT KILLED?"

 ... I'm using the "WNOHANG" flag here so that the os.waitpid()
 function will return a tuple of (0,0) if the process isn't
 dead yet. (Shouldn't be possible under these circumstances, but
 understanding how to do this in non-blocking mode is better than
 using the same code pattern in some other case and then being
 surprised, probably unpleasantly, when your process is blocked
 by the call).


-- 
Jim Dennis,
Starshine: Signed, Sealed, Delivered




More information about the Python-list mailing list