防止多次执行 Lua 脚本
Posted
技术标签:
【中文标题】防止多次执行 Lua 脚本【英文标题】:Preventing multiple executions of a Lua script 【发布时间】:2012-12-21 15:55:59 【问题描述】:我正在 Linux 中编写一个只能运行一个实例的 Lua 脚本。为了在 Bash 中完成此操作,我将使用 mkdir
创建一个锁定文件,然后如果文件存在则立即从脚本返回;如果没有先前的实例正在运行,则允许脚本继续运行,并在完成后删除锁定文件。
有没有办法在 Lua 中原子地“检查文件是否存在,如果不存在则创建它”?我在 Lua 文档中找不到任何此类功能,但我是该语言的新手。 io.open("filename","w")
看起来不符合这些要求。如果没有 mkdir
的原生模拟,有没有更好的方法来完成这种类型的 Lua 脚本锁定?谢谢!
【问题讨论】:
这似乎与 ***.com/questions/4990990/lua-check-if-a-file-exists 重复... @renab 我看到了那些;没有一个答案会自动检查和/或创建文件,这是我特别要问的。 这听起来更像是单进程执行,和线程安全不是一回事。 @NicolBolas 是的。为了清楚起见,我已经编辑了问题。 【参考方案1】:只是抄写你最终得到的答案:
if not os.execute("mkdir lockfile >/dev/null 2>&1") then
return
end
--do protected stuff
os.execute("rmdir lockfile")
【讨论】:
谢谢,但这似乎不是原子的;如果文件检查操作 (io.open ("filename", "r")
) 由一个脚本实例执行,然后在文件创建操作发生在第一个实例 (io.open("filename", "w")
) 之前由另一个脚本实例再次执行,那么两个实例都会认为他们可以同时执行。
你可能想要使用 os.execute 然后调用 mkdir
是的,这就是我今天下午得到的结果:if not os.execute("mkdir lockfile >/dev/null 2>&1") then; return; end; --do protected stuff; os.execute("rmdir lockfile")
。看起来 Lua 没有系统调用的本地方式来执行此操作,因为它基于 ANSI C。如果您想为后代编辑您的帖子,我会接受它。我会赞成你的评论,但因为这是我的第一个问题,我没有必要的声誉。以上是关于防止多次执行 Lua 脚本的主要内容,如果未能解决你的问题,请参考以下文章