flock 未在 logout/reboot 上发布

flock doesn't get released on logout/reboot

我正在使用 flock 来尝试确保我的脚本一次只能 运行 一个实例。大多数时候这似乎工作正常;但是当我注销(我使用 i3wm)或者当 PC 重新启动时,锁没有被释放;下次登录时,锁文件仍然存在,脚本无法启动,因为它无法获取新锁。

如您所见,我已经尝试 trap 释放进程退出时的锁定,但这没有帮助。

我是在错误地使用 flock 还是遗漏了什么?我的印象是进程结束时应该释放锁,所以应该包括 logout/reboot.

LOCK_FILE="${HOME}/.my_script.lock"

release_lock() {
    # This shouldn't be necessary but it seems
    # the lock doesn't release on i3 exit
    rm "${LOCK_FILE}"
}


(
    if [[ -n $LOGFILE ]]; then
        exec >>"$LOGFILE" 2>&1
    fi

    flock -xn 200 || { show_message "$(basename [=11=]): cannot acquire lock ${LOCK_FILE}"; exit 3; }
    trap release_lock EXIT

    # Call the main function (not included in this snippet)
    main 200>&-
) 200>"${LOCK_FILE}"

不要删除文件;让持有文件打开的进程退出。

(
    if [[ -n $LOGFILE ]]; then
        exec >>"$LOGFILE" 2>&1
    fi

    flock -xn 200 || { show_message "$(basename [=10=]): cannot acquire lock ${LOCK_FILE}"; exit 3; }

    main
) 200>"${LOCK_FILE}"

main存在时,打开$LOCK_FILE的子shell也将退出,锁也将被删除。

如果要显式释放锁定,请使用 flock --unlock 200 而不是删除文件。