是否有一种简单的方法可以判断ruby脚本是否已在运行,然后对其进行适当处理?例如:我有一个名为really_long_script.rb的脚本。我每隔5分钟就跑一次。当它运行时,我想查看上一次运行是否仍在运行,然后停止执行第二个脚本。有什么想法吗?
答案 0 :(得分:9)
ps是一种非常糟糕的方式,可能会对竞争条件开放。
传统的Unix / Linux方式是将PID写入文件(通常在/ var / run中)并检查启动时是否存在该文件。
e.g。 pidfile位于/var/run/myscript.pid,然后在运行程序之前检查是否存在。有一些技巧可以避免竞争条件,包括使用O_EXCL(排除锁定)来打开文件和符号链接。
然而,不太可能,您应该尝试编码以通过在文件系统上使用原子操作来避免竞争条件。
要保存重新发明轮子,您可能需要查看http://rubyforge.org/projects/pidify/
答案 1 :(得分:1)
一个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存在并退出。