如何在用shell脚本更新java文件时监视该文件

如何在用shell脚本更新java文件时监视该文件,java,file,shell,concurrency,Java,File,Shell,Concurrency,我有一个日志文件,它将由shell脚本更新。此shell脚本有许多操作,并在每次操作后更新文件,表示操作已完成。现在,我需要从servlet“侦听”这个文件,并以与日志记录相同的方式将响应发送回最终用户(即操作a已完成、操作B已完成等等)。现在,如果servlet和shell脚本试图同时打开该文件,我肯定会出现一些错误。在java中,我想我可以将其作为IOException处理,并继续尝试读取该文件,以便在shell脚本不更新该文件时它可以工作。我应该如何在shell脚本中处理这个问题?如果我在

我有一个日志文件,它将由shell脚本更新。此shell脚本有许多操作,并在每次操作后更新文件,表示操作已完成。现在,我需要从servlet“侦听”这个文件,并以与日志记录相同的方式将响应发送回最终用户(即操作a已完成、操作B已完成等等)。现在,如果servlet和shell脚本试图同时打开该文件,我肯定会出现一些错误。在java中,我想我可以将其作为IOException处理,并继续尝试读取该文件,以便在shell脚本不更新该文件时它可以工作。我应该如何在shell脚本中处理这个问题?如果我在java中以只读模式打开文件会有帮助吗?还要注意,shell脚本只写不读,servlet只读不写


此外,欢迎您就更好地实现此工作流提出建议。

您使用的是Java 7吗?如果是这样的话,也许新的观察者服务会对你有用。我个人并没有使用过它,但它的想法是当文件/文件夹发生更改时,您可以在代码中收到通知。这可能会使您的代码比简单地重复轮询文件更干净


由于您无法使用WatchService,您可以使用
file.lastModified()
轮询上次修改的文件

如果定期执行此操作,则可以比较结果,如果结果发生更改,则说明该文件已被shell脚本修改。每次轮询时可能需要创建一个新的文件对象,但由于文件根本没有打开读取,因此不会出现访问问题


但是,即使您打开文件并比较其内容,您也不会遇到任何访问问题,除非您的shell以独占访问方式打开文件。

是的,我知道我在java中不会遇到访问问题,因为我可以以只读模式打开它。但是假设我试图用java阅读它,而脚本试图同时写入它?它不会在shell中抛出一个错误,比如“文件已经打开”。无法写入?不,因为Java打开文件时没有锁定它。因此,shell可以打开文件进行读写操作——但是,如果您用Java读取文件,而shell同时写入文件,那么内容显然不一致。在基于Unix的系统上根本没有文件锁,这些锁只存在于Windows(可能还有其他罕见的操作系统)上。这意味着shell和Java都不能以独占方式打开文件,因此不会抛出错误。在任何情况下,使用
lastModified()
都不会打开文件,而只会查询文件系统中的修改日期。非常感谢您的建议和上次修改的内容。至于不一致的事情,我并不特别烦恼。我将在每个日志行的末尾附加一些已知的序列,并丢弃在java中读取时遗漏的行。我将在下一次迭代中选择它们。