Flock Mutex Critical Section
Prevent concurrent script runs with flock on a lockfile, distinguishing owner from contenders and timing out politely.
Code
#!/usr/bin/env bash
set -euo pipefail
readonly LOCK_FILE="/tmp/nightly-sync.lock"
readonly LOCK_WAIT=5
# 形态一:非阻塞抢锁,拿不到直接退出(调度器友好)
exec 9>"${LOCK_FILE}"
if ! flock -n 9; then
echo "另一实例正在运行,跳过本次执行" >&2
exit 0
fi
# 形态二:限时等待锁(需要排队的场景)
# flock -w "${LOCK_WAIT}" 9 || { echo "锁等待超时" >&2; exit 75; }
echo "获得锁,PID $$ 开始同步"
critical_section() {
local started=$(date +%s)
# ... 同步主体,异常退出时锁随文件描述符自动释放 ...
sleep 2
echo "同步完成,耗时 $(( $(date +%s) - started ))s"
}
critical_section
# 拿到锁后派生的后台任务也持锁,需要先关描述符
exec 9>&-
echo "锁已释放,脚本结束"
Report a problem with this exampleOpens a pre-filled issue on GitHub.