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

Reply via email to