javascript - 检查进程 A 写入的文件是否准备好被进程 B 读取

标签 javascript linux shell wait lsof

我有一个执行 k-shell 的 Java 脚本,它调用一个写入文件 A 的程序。此后,相同的 Java 脚本解析输出文件 A。没有其他进程读取或写入文件 A。

问题是文件 A 并不总是准备好及时解析,我认为这是因为即使在程序和调用 shell 返回后文件系统仍在完成其工作。只有当有很多进程在运行时才会发生这种情况。

lsof 似乎在我的系统上不起作用。如果我用编辑器打开文件,lsof 会显示编辑器进程,但如果我将文件名传递给 lsof,我会得到: lsof: 没有文件使用位于:文件名

我不认为 fileLock 会起作用,因为我必须在从程序或 k-shell 返回之前解锁它,到那时文件可能还没有完全关闭。

我的想法是编写一个简短的脚本来重命名 (mv) 文件,然后让解析器解析重命名的文件,我的理解是文件在完全写入之前无法重命名。我将 mv 命令放在一个 while 循环中,该循环检查 mv 命令的 stdOut 中是否有任何内容,理论上如果它是空的,我们就可以开始了。

#! /bin/ksh
# Move a file. The idea is that this script will not return until the mv is
# complete. If mv is successful, mv.out.txt should be empty.

mv $1/camber.out $1/camber.out.copy > mv.out.txt
while [[ -s mv.out.txt ]] ; 
do
    echo "mv did not happen"
    mv $1/camber.out $1/camber.out.rename > mv.out.txt
done
echo "mv should have taken place"

exit

我还没有看到一个 mv 被阻止的例子。任何评论、建议、提示或侮辱都将不胜感激。在此先感谢大家。

最佳答案

我没有评论的能力,所以这应该是一个答案。无论如何,这听起来像是异步执行的问题——java 程序调用 bash 脚本,该脚本由操作系统作为单独的程序处理,因此与 java 程序同时运行。为了让一切正常运行,您只需要确保 bash 脚本同步运行——也就是说,脚本必须在 Java 继续运行之前完成。我相信this所以与阻止相关的答案应该做你需要的。解决方案是这样的:

ProcessBuilder pb = new ProcessBuilder("myscript.sh");
Process p = pb.start();     // Start the process.
p.waitFor();                // Wait for the process to finish.
System.out.println("Script executed successfully");

这会强制 Java 程序休眠,直到 bash 脚本完成。

正如您在下面的评论中指出的那样,可能需要将相同的逻辑应用于 k-shell。您可以使用 wait 命令,该命令将作业作为可选参数来等待进程(如果您不传入特定作业,进程将等待所有 子进程完成)。

关于javascript - 检查进程 A 写入的文件是否准备好被进程 B 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30474210/

相关文章:

javascript - 如何将参数传递给表单标签外部定义的javascript函数?

javascript - 如何用 Angular.js 动态生成 DOM?

c - libcurl 应用程序 linux C 的静态编译(缺少库)

安卓 : Launch test on device FROM device/application

c++ - 使用命令行交互编写后台程序

linux - 如何编辑脚本,使变量值包含在撇号内而不需要用户添加撇号?

javascript - 像在 Python 中那样比较 Javascript 中的两个列表的最佳方法是什么?

javascript - 与当前日期时间比较

c - 为什么 "sys_clone"定义在 "./arch/h8300/kernel/process.c"中?

java - 使用 Java 在 Linux 上查找给定文件的根目录