如何限制同一个Ruby脚本的并发实例?

Mar*_*cos 10 ruby mutex semaphore locking multiple-instances

在Ruby 1.9.x中,可能是一种简单的方法,不允许我的Ruby脚本再次运行,或者等待前一个实例完成?**

我希望避免凌乱的文件锁定或进程表检查.

核心中是否存在类似全局互斥或信号量的东西?我研究了本机Mutex,但这似乎只适用于一个Ruby进程中的线程,而不是跨越不同的进程.

**稍后我可能会添加超时功能,或限制N个实例,或者看起来使用多个全局锁(每个系统范围的资源一个,应该只有一个实例).

Mar*_*cos 5

这个非常短的代码将冻结到位,直到您的脚本命名的/ tmp中的锁定文件被独占锁定:

File.open("/tmp/#{File.basename $0}.lock", File::RDWR|File::CREAT, 0644).flock(File::LOCK_EX)
Run Code Online (Sandbox Code Playgroud)

锁定它的任何其他程序,无论是否为Ruby,只需终止或被终止,以便新的流程实例解除阻塞并继续.所以现在这个解决方法做了我需要的.我可以用我的Ruby程序调用

timeout 1m ./myrubyscript.rb
Run Code Online (Sandbox Code Playgroud)

例如,如果我不耐烦,请从包装bash脚本中获取.(在这个例子中,myrubyscript.rb将在1分钟后终止并获得文件锁定以继续执行它所写的操作.)


the*_*Man 2

这通常可以在操作系统级别解决,方法是检查标志文件而不是尝试再次启动,而不是在脚本本身中。

但是,如果您想签入脚本,请在已知位置查找信号量文件。如果它存在并且不在适合您的启动窗口的给定时间窗口内,则删除该文件并创建一个新文件。如果在您的时间窗口内,则退出。

如果您不使用 cron 类型机制启动,则可以使用文件锁定、在文件中存储时间戳或许多其他检查。每种方法都有其优点和缺点。

您需要捕获中断,以便当您从 Control-C 退出时也会删除该文件。

仔细阅读右侧的相关问题。尽管它们涵盖了其他各种语言,但建议的答案将有助于理解问题以及跨所有语言解决这些问题的可能方法。