在我的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会话上运行启动另一个进程时,它仍在运行而不是出现。
任何建议请。
答案 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服务。)