开发者

bash flock: exit if can't acquire lock

开发者 https://www.devze.com 2023-03-27 20:08 出处:网络
The following lock mechanism is used for preventing a cron job from running concurrently: #!/bin/bash echo \"Before critical section\"

The following lock mechanism is used for preventing a cron job from running concurrently:

#!/bin/bash

echo "Before critical section"
(
    flock -e 200
    echo "In critical section"
    sleep 5
) 200>/tmp/blah.lockfile
echo "After critical section"

When running two instances together, the later waits until the first finishes, and then runs. This can cause backlogs of scri开发者_JAVA百科pts waiting to run.

How do I alter this script so that if flock can't acquire the lock, it terminates the script? I've tried -n without success.


flock -n -e 200 || exit 1

flock -n tells you it failed by returning a failure code (something other than zero). You could instead do set -e at the top of your script to make it exit when it sees any unchecked error.

Depending on your application, you might want to exit 0 to indicate success when the lock can't be acquired.


We use exclusive lock on the script file itself, $0 is the name of command file.

exec 200<$0
flock -n 200 || exit 1

The whole solution is in two lines of code. But the trick is to open $0 for reading and then obtain exclusive lock for it.

0

精彩评论

暂无评论...
验证码 换一张
取 消