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:
easy_install tendo
pip install tendo
- manually by getting it from http://pypi.python.org/pypi/tendo
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.