Check to see if python script is running Check to see if python script is running python python

Check to see if python script is running


A technique that is handy on a Linux system is using domain sockets:

import socketimport sysimport timedef get_lock(process_name):    # Without holding a reference to our socket somewhere it gets garbage    # collected when the function exits    get_lock._lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)    try:        # The null byte (\0) means the socket is created         # in the abstract namespace instead of being created         # on the file system itself.        # Works only in Linux        get_lock._lock_socket.bind('\0' + process_name)        print 'I got the lock'    except socket.error:        print 'lock exists'        sys.exit()get_lock('running_test')while True:    time.sleep(3)

It is atomic and avoids the problem of having lock files lying around if your process gets sent a SIGKILL

You can read in the documentation for socket.close that sockets are automatically closed when garbage collected.


Drop a pidfile somewhere (e.g. /tmp). Then you can check to see if the process is running by checking to see if the PID in the file exists. Don't forget to delete the file when you shut down cleanly, and check for it when you start up.

#/usr/bin/env pythonimport osimport syspid = str(os.getpid())pidfile = "/tmp/mydaemon.pid"if os.path.isfile(pidfile):    print "%s already exists, exiting" % pidfile    sys.exit()file(pidfile, 'w').write(pid)try:    # Do some actual work herefinally:    os.unlink(pidfile)

Then you can check to see if the process is running by checking to see if the contents of /tmp/mydaemon.pid are an existing process. Monit (mentioned above) can do this for you, or you can write a simple shell script to check it for you using the return code from ps.

ps up `cat /tmp/mydaemon.pid ` >/dev/null && echo "Running" || echo "Not running"

For extra credit, you can use the atexit module to ensure that your program cleans up its pidfile under any circumstances (when killed, exceptions raised, etc.).


The pid library can do exactly this.

from pid import PidFilewith PidFile():  do_something()

It will also automatically handle the case where the pidfile exists but the process is not running.