常に書き込みを行っている別のJavaプロセスのログファイルを監視しています。これらの2つのプロセス(監視アプリケーションと監視対象アプリケーション)は、Linuxディストリビューションのcentosで実行されています。
問題は、監視対象アプリケーションを再起動するたびに、監視対象アプリケーションで次のエラーが発生するように見えることです。
java.io.IOException:FileMonitorのLogMonster.fileChanged(LogMonitor.java:57)のjava.io.RandomAccessFile.read(RandomAccessFile.java:361)のjava.io.RandomAccessFile.readBytes(ネイティブメソッド)での入力/出力エラー.fireFileChangeEvent(FileMonitor.java:96)at FileMonitor $ FileMonitorTask.run(FileMonitor.java:128)at java.util.TimerThread.mainLoop(Timer.java:512)at java.util.TimerThread.run(Timer.java: 462)
キーとしてファイル名、値としてRandomAccessFileオブジェクトを使用してマップを保持し、このオブジェクトをリスナーとして追加した後、次のようにデータを設定します。
monitor.addFileChangeListener(logMonitor、LogFileName、LogMonitor_Properties.getTimeDelay()); randomAccessFile_list.put(LogFileName、new RandomAccessFile(LogFileName、 "r"));
ファイルが変更されるたびにイベントが発生し、監視対象のアプリケーションが再起動された後(再起動される前は正常に機能します)、RandomAccessFileからコンテンツを読み取ろうとしているのはeventFired関数内です。
'fileChanged'関数内の次のコード行がエラーの原因です。
randomAccessFile_list.get(file.getAbsolutePath())。read(byteArray);
bashスクリプトを使用して、アプリケーションのすべてのバージョンを強制終了し、「go」ファイルで再起動します。
goの内容:
cd / path / to / app
。/殺す
nohup ./app.run&
キルの内容:
kill -9 $(lsof app.run | awk'{print $ 2}')
kill -9 $(lsof app.log | awk'{print $ 2}')
kill -9 $(lsof app.go | awk'{print $ 2}')
app.runの内容:
./app.go >> app.log 2>&1
app.logの内容:アプリケーションのテキスト出力のみ。
app.goの内容:
。/path/to/some/other/location/setClassPath.go
CLASSPATH =$CLASSPATHをエクスポートします
エコー$CLASSPATH
/usr/local/jdk1.6.0_27/bin/java -cp $ CLASSPATH MyApp
あなたがそれを読む前に疲れ果てているように見える質問を投稿することをお詫びします、しかし私は本当に私の知恵の終わりにいます、そしてどんな助けでも大いに感謝されます。
前もって感謝します。