Make sure only a single instance of a program is running Make sure only a single instance of a program is running python python

Make sure only a single instance of a program is running


The following code should do the job, it is cross-platform and runs on Python 2.4-3.2. I tested it on Windows, OS X and Linux.

from tendo import singletonme = singleton.SingleInstance() # will sys.exit(-1) if other instance is running

The latest code version is available singleton.py. Please file bugs here.

You can install tend using one of the following methods:


Simple, cross-platform solution, found in another question by zgoda:

import fcntlimport osimport sysdef instance_already_running(label="default"):    """    Detect if an an instance with the label is already running, globally    at the operating system level.    Using `os.open` ensures that the file pointer won't be closed    by Python's garbage collector after the function's scope is exited.    The lock will be released when the program exits, or could be    released if the file pointer were closed.    """    lock_file_pointer = os.open(f"/tmp/instance_{label}.lock", os.O_WRONLY)    try:        fcntl.lockf(lock_file_pointer, fcntl.LOCK_EX | fcntl.LOCK_NB)        already_running = False    except IOError:        already_running = True    return already_running

A lot like S.Lott's suggestion, but with the code.


This code is Linux specific. It uses 'abstract' UNIX domain sockets, but it is simple and won't leave stale lock files around. I prefer it to the solution above because it doesn't require a specially reserved TCP port.

try:    import socket    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)    ## Create an abstract socket, by prefixing it with null.     s.bind( '\0postconnect_gateway_notify_lock') except socket.error as e:    error_code = e.args[0]    error_string = e.args[1]    print "Process already running (%d:%s ). Exiting" % ( error_code, error_string)     sys.exit (0) 

The unique string postconnect_gateway_notify_lock can be changed to allow multiple programs that need a single instance enforced.