Quick-and-dirty way to ensure only one instance of a shell script is running at a time

bash, lockfile, process, shell

Solution

Here's an implementation that uses a lockfile and echoes a PID into it. This serves as a protection if the process is killed before removing the pidfile:

LOCKFILE=/tmp/lock.txt
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
    echo "already running"
    exit
fi

# make sure the lockfile is removed when we exit and then claim it
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}

# do stuff
sleep 1000

rm -f ${LOCKFILE}

The trick here is the `kill -0` which doesn't deliver any signal but just checks if a process with the given PID exists. Also the call to `trap` will ensure that the lockfile is removed even when your process is killed (except `kill -9`).

Problem

What's a quick-and-dirty way to make sure that only one instance of a shell script is running at a given time?

Original source

Related problems