At most 1 running copy

Ed Wilts ewilts at ewilts.org
Sat Nov 27 04:49:51 UTC 2004


On Sat, Nov 27, 2004 at 07:41:46AM +0800, John Summerfield wrote:
> On Friday 26 November 2004 22:44, Ed Wilts wrote:
> > Yesterday 22:44:50
> >
> Potential race condition there. Junk it.

I did!  What I inherited was worse than a race condition - it flat out
didn't work.
 
> I suggest you create  /var/run/lock-$USER-APPLICATION and lock it.

Yup, that's what I just ended up doing today.  It turns out that this is
discussed in the Perl faq.
 
> Once you get to lock it, you're the only one running.
> 
> Release the lock when you're finished. I don't see that it matters if you 
> leave the file there, and I'd want to test it before telling you it's alwasy 
> safe to remove the file. If you can remove it the unlock it that woild be 
> okay, but that flies in the face of my experience in oter environments.

For the record, this snippet works just fine (a per-user lock).

use FileHandle;
use Fcntl qw(:DEFAULT :flock);
my $FH = new FileHandle;
sysopen(FH, "ftphandler.lock", O_RDWR | O_CREAT) or die "can't open ftphandler.lock: $!";
flock(FH, LOCK_EX | LOCK_NB) or exit;
print "running...\n";
[rest of code here]
close (FH);
unlink ("ftphandler.lock");

It doesn't matter if the file is closed or deleted - the right thing
just happens and it doesn't matter if the lock file is there the next
time around or not.  The snippet above silently exits if the process
can't get the lock.  If I remove the LOCK_NB, the process will wait
until it can get the lock.

Thanks,
        .../Ed

-- 
Ed Wilts, RHCE
Mounds View, MN, USA
mailto:ewilts at ewilts.org
Member #1, Red Hat Community Ambassador Program




More information about the fedora-list mailing list