Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the best way to make sure only one instance of a Perl program is running?

There are several ways to do this, but I'm not sure which one of them is the best.

Here's what I can think of:

  • Look for the process using pgrep.
  • Have the script lock itself using flock, and then check if it is locked each time it runs.
  • Create a pid file in /var/run/program_name.pid and check for existence, and compare pids if needed.

There are probably more ways to do this. What do you think is the best approach?

like image 886
Tom Feiner Avatar asked Jan 18 '09 21:01

Tom Feiner


3 Answers

There are many ways to do it. PID files are the traditional way to do it. You could also hold a lock on a file, for example the program itself. This small piece of code will do the trick:

use Fcntl ':flock';
open my $self, '<', $0 or die "Couldn't open self: $!";
flock $self, LOCK_EX | LOCK_NB or die "This script is already running";

One advantage over PID files is that files automatically get unlocked when the program exits. It's much easier to implement in a reliable way.

like image 109
Leon Timmermans Avatar answered Nov 12 '22 19:11

Leon Timmermans


Do the old PID file trick.

  • start process
  • see if there is a file called "myprog.PID"
  • check for existence of running proc. with matching PID using kill 0, $pid
  • if prog name of PID proc. matches, complain loudly and exit
  • if not, clean up stale "myprog.PID"
  • create a file called "myprog.PID" and then continue

HTH

cheers,

Rob

like image 24
Rob Wells Avatar answered Nov 12 '22 17:11

Rob Wells


All of the options that you list are fine. One thing with this though, is to be aware that in rare cases, you can end up with a process that runs for a very long time (i.e., stuck waiting on something). You might want to think about keeping an eye on how long the other running instance has been running and possibly send yourself an alert if it exceeds a certain amount of time (such as a day perhaps).

like image 2
Scott Hoffman Avatar answered Nov 12 '22 19:11

Scott Hoffman