Docunext


flock

June 18th, 2010

Myon wrote another blog post about cool unix features, this time about flock:

Cool unix features: flock

This is definitely of interest to me, as I've written some shell scripts recently which use a manual lock implementation which I'm not sure if it works as I'd intended.

For example, here's a shell script I wrote to be run when incron notices a filesystem event in the /etc/bind/ folder:

#!/bin/sh
# Copyright: Savonix Corporation - http://www.savonix.com/
# Author:    Albert Lash
# License:   MIT
# Date:      20090602
lockfile="/var/lock/rebuild_bind.lock"
if [ -f $lockfile ] ; then
    exit 0
else
    touch $lockfile
    sleep 20
    #/etc/init.d/bind9 restart
    /usr/sbin/rndc reload
    rm $lockfile
    exit 0
fi;

The man page mentions a third form of using flock, like this:

(
         flock -s 200
         # ... commands executed under lock ...
       ) 200>/var/lock/mylockfile

That's the one I'll use. Actually, it took me a few minutes to figure this one... the lock wasn't working for me when I was trying a non-blocking, exclusive lock. I did some more search and found this helpful page:

using flock to protect critical sections in shell scripts

This is now what I'm using:

#!/bin/sh
# Copyright: Savonix Corporation - http://www.savonix.com/
# Author:    Albert Lash
# License:   MIT
# Date:      20090602
exec 8>/var/lock/rebuild_bind.lock;
if flock -n -x 8; then
    /usr/sbin/rndc reload
    sleep 30;
fi

The reason why I'm using sleep? My incron setup occasionally results in many triggers getting fired, and I only want one to result in the rebuilding of the bind database. I'll add some more logic to this, so that if something goes awry, it will alert me.

Yearly Indexes: 2003 2004 2006 2007 2008 2009 2010 2011 2012 2013 2015 2019 2020 2022