MRAB schrieb:
pyt...@bdurham.com wrote:
Is there an os independent way to check if a python app is running?
Goal: I have a server program based on cherrypy that I only want to
have running once. If a system administrator accidentally attempts to
run this program more than once, I would like the 2nd instance of the
program to detect that its already running and exit.
You could use lockfile: http://pypi.python.org/pypi/lockfile/0.7
If a certain file exists and is locked, then the app is already running.
Not only exists, he should also use the OS' locking mechanisms. The file
could otherwise be stale.
We use this:
import platform
is_windows = False
if platform.system() == 'Windows':
is_windows = True
import os
class LockFileCreationException(Exception):
pass
class LockFile(object):
def __init__(self, name, fail_on_lock=False, cleanup=True):
self.name = name
self.cleanup = cleanup
try:
self.fd = os.open(name, os.O_WRONLY | os.O_CREAT | os.O_APPEND)
except OSError, e:
if e[0] == 2:
raise LockFileCreationException()
self.file = os.fdopen(self.fd, "w")
if is_windows:
lock_flags = msvcrt.LK_LOCK
else:
lock_flags = fcntl.LOCK_EX
if fail_on_lock:
if is_windows:
lock_flags = msvcrt.LK_NBLCK
else:
lock_flags |= fcntl.LOCK_NB
try:
if is_windows:
msvcrt.locking(self.file.fileno(), lock_flags, 1)
else:
fcntl.flock(self.file, lock_flags)
except IOError, e:
if e[0] == 11:
raise LockObtainException()
raise
def __enter__(self):
return self.file
def __exit__(self, unused_exc_type, unused_exc_val, unused_exc_tb):
self.file.close()
# we are told to cleanup after ourselves,
# however it might be that another process
# has done so - so we don't fail in that
# case.
if self.cleanup:
try:
os.remove(self.name)
except OSError, e:
if not e[0] == 2:
raise
Diez
--
http://mail.python.org/mailman/listinfo/python-list