2017-09-23 57 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。)