How can I avoid running a python script multiple times?
Jeff Epler
jepler at unpythonic.net
Tue Jan 28 09:15:01 EST 2003
While not a complete solution to your problem, you can use os.kill(pid, 0)
to find out if a process exists. On my system, there can be three
results:
os.kill(pid, 0) -> None: process exists, and you are process owner
or root
os.kill(pid, 0) -> OSError, Operation not permitted:
process exists, you are not owner or root
os.kill(pid, 0) -> OSError, No such process:
process does not exist
beware that if your program died long ago but left it's pidfile there's
no guarantee that another process has been given the same pid. In fact,
a malicious user could find out the pid, then wait for it to die for
some reason, and quickly fork() enough times to get a process with that
pid. Then you will believe that your program is still running, even
though it has stopped.
Nevertheless, this is the model used by many "one instance" unix
programs.
Other approaches include:
* Have init spawn the process from inittab. init will re-spawn the
process when it dies, but will never start two concurrent programs
from the same inittab line
* If the process uses some resource that requires exclusive access
by its nature (for instance, bind()ing a well-known port number)
then a second instance will fail to run anyhow
* Unix pipes and X properties offer two more ways to determine if a
program is running, and may additionally let you transmit commands
to the existing instance of the program if it is invoked again. The
links text-mode browser uses unix pipes for this purpose, and Mozilla
uses (I believe) X properties.
I tried but failed to work out how to let only one opener of a unix
pipe succeed. The X property approach may be prone to race
conditions, I don't know enough about that to say.
Jeff
More information about the Python-list
mailing list