防止多次执行 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Lua代码加密,防止代码反编译

使用Lua脚本通过原子减防止超卖

如何防止部分视图中的脚本多次加载并在同一页面中多次使用部分时导致错误

防止多次执行 JavaScript 函数

Redis使用Lua的一些优化和注意事项

如何加密lua代码