【问题标题】:flock doesn't get released on logout/reboot注销/重启时羊群不会被释放
【发布时间】:2017-10-22 19:16:44
【问题描述】:

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

如您所见,我已经尝试trap 释放进程退出时的锁定,但这无济于事。

我是在错误地使用flock,还是我错过了其他东西?我的印象是锁应该在进程结束时被释放,所以应该包括注销/重启。

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 ${0}): 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}"

【问题讨论】:

    标签: linux bash shell locking flock


    【解决方案1】:

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

    (
        if [[ -n $LOGFILE ]]; then
            exec >>"$LOGFILE" 2>&1
        fi
    
        flock -xn 200 || { show_message "$(basename ${0}): cannot acquire lock ${LOCK_FILE}"; exit 3; }
    
        main
    ) 200>"${LOCK_FILE}"
    

    main 存在时,打开$LOCK_FILE 的子shell 也会退出,并且锁会被解除。

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

    【讨论】:

    • 感谢您的回答,看来我确实需要 trap/release_lock 来释放注销时的锁定 - 但使用 --unlock 似乎可以正确释放锁定。在我将此问题设置为“已回答”之前将对此进行测试。
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2012-09-20
    • 2015-02-10
    • 2012-12-30
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多