ruby多次阻止运行脚本

时间:2016-12-18 03:55:34

标签: ruby

我编写了ruby脚本,我把它放在cronjob中,如果有一个进程已在同一个脚本上运行,则需要阻止运行相同的脚本。基本上我试图阻止为同一个脚本运行重复的进程,如果脚本实际上没有运行,那么只有它必须运行。

我尝试使用flock,但我认为它仅用于写入目的而锁定文件。就像任何进程已经写入文件一样,没有其他进程可以写同一个文件。

不知怎的,我通过检查正在运行的进程来管理这个,如果有的话,如果没有,那么只有进程才会启动。但是想知道Ruby中是否有任何内置模块可以处理这个问题。

2 个答案:

答案 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__