gpt4 book ai didi

linux - flock 在注销/重启时不会被释放

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:52 29 4
gpt4 key购买 nike

我正在使用 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}"

最佳答案

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

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

关于linux - flock 在注销/重启时不会被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46878164/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com