2017-09-23 35 views
0

在我的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

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仿真环境中,例如Mirosoft Services for Unix,MSYS或Cygwin。)

相关问题