我有一个执行 k-shell 的 Java 脚本,该脚本调用一个写入文件 A 的程序。此后,相同的 Java 脚本解析输出文件 A。没有其他进程读取或写入文件 A。
问题是文件 A 并不总是准备好及时解析,我认为这是因为即使在程序和调用 shell 返回之后文件系统仍在完成其工作。这仅在运行大量进程时发生。
lsof 似乎不适用于我的系统。如果我用编辑器打开一个文件,lsof 会向我显示编辑器进程,但是如果我将文件名传递给 lsof,我会得到: lsof: no file use located: filename
我不认为 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 被搁置的实例。任何意见、建议、暗示或侮辱将不胜感激。在此先感谢大家。