我使用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}"
答案 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
而不是删除文件。