ruby文件执行锁定以避免同一脚本的多个进程

时间:2017-09-23 05:48:59

标签: ruby

在我的ruby脚本中,我已经放下了代码,以确保在另一个进程已经运行时不应该再次并行执行相同的脚本。

if $0 == __FILE__
  if File.new(__FILE__).flock(File::LOCK_EX | File::LOCK_NB)
    if RbConfig::CONFIG['host_os'].include? 'linux'
      linux_main
    elsif RbConfig::CONFIG['host_os'].include? 'mingw'
      windows_main
    elsif RbConfig::CONFIG['host_os'].include? 'solaris'
      solaris_main
    end
  end
end

__END__

但它在Windows上没有按预期工作。我已经启动了一个进程,当我在另一个PowerShell会话上运行启动另一个进程时,它仍在运行而不是出现。

任何建议请。

1 个答案:

答案 0 :(得分:1)

Ruby的File类主要是POSIX之上的薄层。因此,在非POSIX平台上,有几种方法不起作用或表现不同。这在文档中明确承认,例如the method you are using says

  

并非在所有平台上都可用。

它还依赖于实现。例如。 JRuby经历了为Java开发完整POSIX兼容层的麻烦,因此,在Windows上,JRuby实际上更符合Ruby而不是“Ruby”(即YARV)!

长话短说:File#flock只是POSIX flock函数之上的一个薄层,而且该函数在Windows上根本不存在。请注意,Windows 使用LockFile Windows API函数支持文件锁定。但是,它不支持POSIX文件锁定。 (可能在POSIX仿真环境中,例如适用于Unix,MSYS或Cygwin的Mirosoft服务。)