确定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是否存在并退出。