How can I prevent more than one instance of a script from running?
I use
flock -n "$0" true || exit 1 in some of my shell scripts that need locking (i.e. check whether the script itself has an advisory lock on it). The same could be implemented in Perl:
use FindBin qw($Bin $Script);
use Fcntl ':flock';
open my $fh, '>>', "$Bin/$Script" or die "open(>>$Bin/$Script): $!";
flock $fh, LOCK_EX|LOCK_NB or die "Another copy seems to be running";
The
>> mode may be required depending on how
flock is implemented (you may get by with just
<). Alternatively, remove
|LOCK_NB to make your process wait until it has the lock instead of terminating. Lock is automatically removed when the owning process terminates, so no need to manually unlock anything.