我编写了ruby脚本,我把它放在cronjob中,如果有一个进程已在同一个脚本上运行,则需要阻止运行相同的脚本。基本上我试图阻止为同一个脚本运行重复的进程,如果脚本实际上没有运行,那么只有它必须运行。
我尝试使用flock,但我认为它仅用于写入目的而锁定文件。就像任何进程已经写入文件一样,没有其他进程可以写同一个文件。
不知怎的,我通过检查正在运行的进程来管理这个,如果有的话,如果没有,那么只有进程才会启动。但是想知道Ruby中是否有任何内置模块可以处理这个问题。
答案 0 :(得分:3)
此PID文件gem可以为您提供帮助。
以下是一个例子:
require 'pidfile'
pf = PidFile.new
puts "LAUNCHING SCRIPT"
loop do
sleep 1
puts "+1"
end
启动它一次正常。
尝试启动它两次返回:
pidfile.rb:39:in `initialize': Process (lock.rb - 17724) is already running. (PidFile::DuplicateProcessError)
from lock.rb:3:in `new'
from lock.rb:3:in `<main>'
注意:默认情况下,PID文件以/tmp
写入。它在Ubuntu上不是问题,因为在重新启动时会清除/tmp
。
在每天清理/tmp
的其他系统(例如RHEL)上可能会出现问题。
答案 1 :(得分:3)
谢谢@Eric。但我设法让这个工作没有安装任何额外的宝石。
if $0 == __FILE__
if File.new(__FILE__).flock(File::LOCK_EX | File::LOCK_NB)
validation()
else
raise "Another process running for the same script."
end
end
__END__