避免 Lua 脚本的多次执行

3
我正在Linux中编写一个Lua脚本,只能有一个实例运行。在Bash中,我会使用`mkdir`创建一个锁文件,如果文件存在,则立即从脚本返回;如果没有先前的实例正在运行,则允许脚本继续运行,并在完成后删除锁文件。
在Lua中是否有一种原子性的“检查文件是否存在或者不存在则创建”的方法?我在Lua文档中找不到这样的功能,但我对这种语言还不熟悉。`io.open("filename","w")`看起来并不满足这些要求。如果没有类似于`mkdir`的本地模拟,那么在Lua中实现此类脚本锁定的更好方法是什么?谢谢!

这似乎是 https://dev59.com/Pm445IYBdhLWcg3wM3bx 的重复。请尝试在该网址发布的有关检查文件是否存在的 LUA 解决方案之一。 - renab
@renab 我看到了那些答案,但没有一个答案会自动检查和/或创建文件,这正是我特别询问的内容。 - Joe Stech
这更像是单进程执行,而不是线程安全。 - Nicol Bolas
@NicolBolas 没错。我已经编辑了问题以便更清晰地表达。 - Joe Stech
1个回答

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"))发生之前再次由另一个脚本实例执行,则两个实例都会认为它们可以同时执行。 - Joe Stech
1
你可能想使用os.execute来调用mkdir。 - Lyn Headley
是的,这就是我今天下午得出的结果:if not os.execute("mkdir lockfile >/dev/null 2>&1") then; return; end; --do protected stuff; os.execute("rmdir lockfile")。看起来Lua没有本地方法可以在不进行系统调用的情况下执行此操作,因为它基于ANSI C。如果您想要编辑您的帖子以备后人之需,我会接受它。我会点赞您的评论,但由于这是我的第一个问题,我没有必要的声望。 - Joe Stech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接