2017-09-23 9 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では期待どおりに動作しません。私は1つのプロセスを開始しました。別のPowerShellセッションで別のプロセスを起動しても、実行するのではなく、実行中です。

提案はありません。

答えて

1

RubyのFileクラスは、ほとんどPOSIXの上にある薄いレイヤーです。その結果、いくつかのメソッドは非POSIXプラットフォームでは動作しないか、動作が異なります。これは、文書で明確に認められています。 the method you are using says

一部のプラットフォームでは利用できません。

実装によっても異なります。例えば。 JRubyはJava用の完全なPOSIX互換レイヤーを開発するのに手間取ってしまいました。その結果、Windowsでは、JRubyは実際にRubyに準拠しています(つまり、YARVは「Ruby」です)。

ロングストーリーショート:File#flockは、POSIXのflock機能の上にある薄い層であり、その機能はWindows上に存在しません。 Windows は、LockFile Windows API関数を使用してでファイルのロックをサポートしています。ただし、POSIXファイルロックをサポートしていません。 (Unix、MSYS、Cygwin用のMirosoft ServicesなどのPOSIXエミュレーション環境を除く)

関連する問題