确定ruby脚本是否已在运行

是否有一种简单的方法来判断ruby脚本是否已经在运行,然后对其进行适当处理? 例如:我有一个名为really_long_script.rb的脚本。 我每隔5分钟就跑一次。 当它运行时,我想查看上一次运行是否仍在运行,然后停止执行第二个脚本。 有任何想法吗?

ps是一种非常糟糕的方式,可能会对比赛条件开放。

传统的Unix / Linux方式是将PID写入文件(通常在/ var / run中)并检查该文件是否在启动时存在。

例如,pidfile位于/var/run/myscript.pid,然后在运行程序之前检查是否存在。 有一些技巧可以避免竞争条件,包括使用O_EXCL(排除锁定)来打开文件和符号链接。

不太可能,您应该尝试编码以通过在文件系统上使用primefaces操作来避免竞争条件。

为了节省重新发明轮子,您可能需要查看http://rubyforge.org/projects/pidify/

汉兰达

描述

一个gem,它确保只运行一个主脚本实例。 简而言之,只有一个。

安装

gem install highlander 

概要

 require 'highlander' # This should be the -first- thing in your code. # Your code here 

同时,回到命令行……

 # First attempt, works. Assume it's running in the background. ruby your_script.rb # Second attempt while the first instance is still running, fails. ruby your_script.rb # => RuntimeError 

笔记

只需要highlander gem就可以确保只能再次启动该脚本的一个实例。 如果您尝试再次启动它将引发RuntimeError。

在bash中:

 if ps aux | grep really_long_script.rb | grep -vq grep then echo Script already running else ruby really_long_script.rb fi 

您可能还应该检查进程是否实际正在运行,这样如果您的脚本在没有自行清理的情况下死亡,它将在下次运行,而不是简单地检查/var/run/foo.pid是否存在并退出。