

java : jdk9.01  
os : linux Red Hat 4.8.5-11

Javaのコードで他のプログラムの出力するファイルのチェックを数秒毎にチェックし、  
存在を確認できたら次に進むというコードを書こうとしています。

[code]

    int n = 0;
    boolean flag = false;
    while (flag == false) {
        TimeUnit.SECONDS.sleep(waitsec);
        flag = Files.exists(path);
         n += 1;
         if (n > limit) {
             System.out.println("limit over");
         }
    }
    
[/code]

上のような感じで書いているのですが  
ところがファイルが出力されているはずなのにflagがtrueになりません。  
trueが帰ることもあるのですがタイミングがバラバラだったりします。  
lsコマンドなどで自分で存在を確認すると  
そのとたんにFiles.existsでもtrueが帰ります。

理由は分かりませんが、シュレディンガーの猫のような感じです。  
自分で見つけた解決策としてはFiles.findを使えばなんとかなるのですが  
Files.existsがなぜうまく作用しないのか理由がしりたいと考えています。

原因がわかる方がいましたら、ご教授お願いします。


CC BY-SA 4.0
2018-09-25T08:33:07.930
48697
2018-09-26T12:46:09.150
29195
question
java linux
JavaのFiles.existsであるはずのファイルが確認できない


ファイル出力側のプログラムでファイル出力をフラッシュしてない場合、タイミングよっては出力がバッファリングされた状態となり、ディスクに書き込まれてないので、他のプログラムからは読めないのかもしれません。

Cだとfflushやfsyncなどを使って明示的に書き込みをフラッシュしてみると変化があるかもしれません。また、Javaだと、PrintWriterなどのFlushableインターフェースの実装で
flush() を呼び出すと書き込みがフラッシュされると思います。


CC BY-SA 4.0
2018-09-25T10:01:26.710
48701
2018-09-25T10:01:26.710
5008
48697
answer


> ネットワークドライブ上の他のPCから出力されたファイルの監視

という条件から推測すると、NFS領域を非同期モードで使用しているため、他のPCで書き出した(作成した)ファイルが同期的に見えないため、と考えます。

NFSサーバのエクスポートオプションに「`sync`」を指定する、加えてNFSクライアントのマウントオプションにも「`sync`」を指定することで解消すると思います。

* * *

なお、OSは「RHEL4」ということですが、[Java9の動作条件](https://www.oracle.com/technetwork/java/javase/jdk9certconfig-3761018.html)によると、RHEL6以上とのことですので、Java9は見送られたほうがよいかと思います。

また、RHEL4のkernelは2.6.9ですので、inotify-java APIも動作しないかと思います。([inotify-
javaのサイト](https://www.openhub.net/p/inotify-java)には、2.6.13以降が必要、とあるため)


CC BY-SA 4.0
2018-09-26T12:46:09.150
48731
2018-09-26T12:46:09.150
20098
48697
answer