Today I learned about
dotlockfile. I've put together an example to test my understanding. To use it start three terminals:
- In terminal1 run the shell script below
- In terminal2 run the shell script below (within 5 seconds)
- In terminal3 view the PIDs with "cat /tmp/lock_test"
If you do the above correctly then terminal2's instance won't start until terminal1's instance is finished. Also, you should see different PIDs for each instance in terminal3.
Example Shell Script:
#!/bin/sh
# --------------------------------------------------------
# This program uses dotlockfile(1) to assure that no other
# instances of itself will run. Only useful as an example.
# It works because other instances will also try to create
# a lockfile of the same name and will find that the file
# already exists. It only locks a resource used by the same
# program. I.e. another program could choose to ignore the
# lock file.
# --------------------------------------------------------
dotlockfile -p -r2 /tmp/lock_test; # lock this instance
TIME=5; # do something with resource (just sleeps)
echo "Sleeping for $TIME";
echo "I.e. no other instances of me will run for $TIME";
sleep $TIME;
echo "Done, about to unlock for other instances";
dotlockfile -u /tmp/lock_test; # unlock this instance
Note that it's just a way to create
lock files as part of
file locking a
process, since "the resource to be controlled is not a regular file at all, so using methods for locking files does not apply".
Moodle advises having cron do this while
mirroring. I'm using it because I've got a cron job that's still running when another instance of it starts.
To install dotlockfile on RedHat you can get an
RPM:
$ rpm -qlp dotlockfile-1.06.1-1mdv2007.0.i586.rpm 2> /dev/null
/usr/bin/dotlockfile
/usr/share/man/man1/dotlockfile.1.bz2
$
I.e. I couldn't easily find it on RHN. It seems to be installed by default on Ubuntu but if you don't have it it is available in Ubuntu's
liblockfile1 package.
No comments:
Post a Comment