Portable way to tell if a process is still alive
gandalf at shopzeus.com
Thu Jan 28 11:50:16 CET 2010
>> Suppose we have a program that writes its process id into a pid file.
>> Usually the program deletes the pid file when it exists... But in some
>> cases (for example, killed with kill -9 or TerminateProcess) pid file is
>> left there. I would like to know if a process (given with its process
>> id) is still running or not. I know that this can be done with OS
>> specific calls. But that is not portable. It can also be done by
>> executing "ps -p 23423" with subprocess module, but that is not portable
>> either. Is there a portable way to do this?
>> If not, would it be a good idea to implement this (I think very
>> primitive) function in the os module?
> Not only is there no way to do it portably, there is no way to do it
> reliably for the general case. The problem is that processes do not have
> unique identifiers. A PID only uniquely identifies a running process; once
> the process terminates, its PID becomes available for re-use.
Non-general case: the process is a service and only one instance should
be running. There could be a pid file left on the disk. It is possible
to e.g. mount procfs, and check if the given PID belongs to a command
line / executed program that is in question. It cannot be guaranteed
that a service will always delete its pid file when it exists. It
happens for example, somebody kills it with "kill -9" or exits on signal
11 etc. It actually did happened to me, and then the service could not
be restarted because the PID file was there. (It is an error to run two
instances of the same service, but it is also an error to not run
it....) Whan I would like to do upon startup is to check if the process
is already running. This way I could create a "guardian" that checks
other services, and (re)starts them if they stopped working.
And no, it is not a solution to write "good" a service that will never
1. It is particulary not possible in my case - there is a software bug
in a third party library that causes my service exit on various wreid
2. It is not possible anyway. There are users killing processes
accidentally, and other unforeseen bugs.
3. In a mission critical environment, I would use a guardian even if
guarded services are not likely to stop
I understand that this is a whole different question now, and possibly
there is no portable way to do it. Just I wonder if there are others
facing a similar problem here. Any thoughs or comments - is it bad that
I would like to achieve? Is there a better approach?
More information about the Python-list