注销/重新启动时,flock不会被释放

时间:2017-10-22 19:16:45

标签: linux bash shell locking flock

我使用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 ${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}"

1 个答案:

答案 0 :(得分:2)

不要删除该文件;只需让打开文件的进程退出。

(
    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而不是删除文件。