How to prevent a Linux program from running more than once?

11,484

Solution 1

The most common way is to create a PID file: define a location where the file will go (inside /var/run is common). On successful startup, you'll write your PID to this file. When deciding whether to start up, read the file and check to make sure that the referenced process doesn't exist (or if it does, that it's not an instance of your daemon: on Linux, you can look at /proc/$PID/exe). On shutdown, you may remove the file but it's not strictly necessary.

There are scripts to help you do this, you may find start-stop-daemon to be useful: it can use PID files or even just check globally for the existence of an executable. It's designed precisely for this task and was written to help people get it right.

Solution 2

Use the boost interprocess library to create a memory block that will be created by the process. If it already exists, it means that there is another instance of the process. Exit.

The more precise link to what you need would be this one.

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/scoped_ptr.hpp>

int main()
{
  using boost::interprocess;
  boost::scoped_ptr<shared_memory_object> createSharedMemoryOrDie;
  try
  {
     createSharedMemoryOrDie.reset( 
       new shared_memory_object(create_only, "shared_memory", read_write));
  } catch(...)
  {
     // executable is already running
     return 1; 
  }

  // do your thing here
}

Solution 3

If you have access to the code (i.e. are writing it):

  • create a temporary file, lock it, remove when done, return 1; if file exists, or,
  • list processes, return 1; if the process name is in the list

If you don't:

  • create a launcher wrapper to the program that does one of the above

Solution 4

I think this scheme should work (and is also robust against crashes):
Precondition: There is a PID file for your application (typically in /var/run/)
1. Try to open the PID file
2. If it does not exist, create it and write your PID to it. Continue with the rest of the program
3. If it exist, read the PID
4. If the PID is still running and is an instance of your program, then exit
5. If the PID does not exist or is used by another program, remove the PID file and go to step 2.
6. At program termination, remove the PID file.

The loop in step 5 ensures that, if two instances are started at the same time, only one will be running in the end.

Solution 5

I do not know what your exact requirement is but I had a similar requirement; in that case I started my daemon from a Shell script ( it was a HP-UX machine) and before starting the daemon I checked if an exec by same name is already running. If it is; then don't start a new one.

By this way I was also able control the number of instances of a process.

Share:
11,484
Jan Deinhard
Author by

Jan Deinhard

Updated on June 07, 2022

Comments

  • Jan Deinhard
    Jan Deinhard almost 2 years

    What is the best way to prevent a Linux program/daemon from being executed more than once at a given time?