确定ruby脚本是否已在运行

时间:2008-09-01 17:34:07

标签: ruby

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

4 个答案:

答案 0 :(得分:9)

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

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

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

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

要保存重新发明轮子,您可能需要查看http://rubyforge.org/projects/pidify/

答案 1 :(得分:1)

Highlander

描述

一个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

注释

只需要高地人宝石确保只有一个实例 该脚本无法再次启动。如果您尝试再次启动它 它会引发一个RuntimeError。

答案 2 :(得分:0)

在bash中:

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

答案 3 :(得分:0)

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