我正在监视另一个不断写入它的java进程的日志文件。这两个进程(监视应用程序和受监视的应用程序)正在linux发行版centos上运行。
问题在于每次重新启动受监控的应用程序时,监控应用程序似乎都会收到此错误:
java.io.IOException:输入/输出错误 at java.io.RandomAccessFile.readBytes(Native Method) 在java.io.RandomAccessFile.read(RandomAccessFile.java:361) 在LogMonster.fileChanged(LogMonitor.java:57) 在FileMonitor.fireFileChangeEvent(FileMonitor.java:96) 在FileMonitor $ FileMonitorTask.run(FileMonitor.java:128) 在java.util.TimerThread.mainLoop(Timer.java:512) 在java.util.TimerThread.run(Timer.java:462)
我将带有文件名的Map作为键,将RandomAccessFile对象作为值保留,并在将此对象添加为侦听器后将其填充如下:
monitor.addFileChangeListener(logMonitor,LogFileName,LogMonitor_Properties.getTimeDelay()); randomAccessFile_list.put(LogFileName,new RandomAccessFile(LogFileName,“r”));
每次修改文件时都会触发一个事件,并且它在eventFired函数中,我试图在重新启动被监视的应用程序之后从RandomAccessFile中读取内容(在它重新启动之前它工作正常)。
'fileChanged'函数中的以下代码行导致错误:
randomAccessFile_list.get(file.getAbsolutePath())读(字节阵列);
我使用bash脚本杀死所有版本的应用程序,然后在“go”文件中重新启动它。
go的内容:
cd / path / to / app
./杀
nohup ./app.run& amp;
杀戮的内容:
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
export CLASSPATH = $ CLASSPATH
echo $ CLASSPATH
/usr/local/jdk1.6.0_27/bin/java -cp $ CLASSPATH MyApp
我很抱歉在您阅读之前发布了一个看起来令人筋疲力尽的问题,但我真的很想知道,任何帮助都会非常感激。
提前致谢。
答案 0 :(得分:1)
从方法名称看,您正在使用this进行文件监控。它实际上并没有打开文件,它只是偶尔对它进行统计。
然后,您还要在地图中保留一个单独的文件句柄。
只有在修改时间发生变化时,库才会触发事件 - 这并不意味着文件中添加了任何新的数据。然后,您显然尝试从文件句柄中读取并获得IO异常。
这种方法存在许多问题,但如果没有看到更多的代码,就无法准确地告诉您问题是什么。我猜测受监视的进程在重新启动时会截断,删除或对文件执行其他操作,这会使打开的文件句柄无效。
当您想要重新加载整个文件(通常是属性文件或正在编辑的文档)时,通常会使用这样的文件监视,而不是尝试执行“尾部”。