Linux 如何等待文件关闭
我有一个外部进程,可以开始写入文件Linux 如何等待文件关闭,linux,Linux,我有一个外部进程,可以开始写入文件如何编写等待文件关闭(当其他进程完成写入时)的脚本。简单的方法:让脚本执行程序并等待它完成。这不好,而且写它会让我感觉脏/tmp/foo.txt是正在测试的文件 #!/bin/bash until [ "$( find /proc/*/fd 2> /dev/null | xargs -i{} readlink {} | grep -c '^/tmp/foo.txt$' )" == "0" ]; do sleep 1; done;
如何编写等待文件关闭(当其他进程完成写入时)的脚本。简单的方法:让脚本执行程序并等待它完成。这不好,而且写它会让我感觉脏/tmp/foo.txt是正在测试的文件
#!/bin/bash
until [ "$( find /proc/*/fd 2> /dev/null |
xargs -i{} readlink {} |
grep -c '^/tmp/foo.txt$' )" == "0" ]; do
sleep 1;
done;
有几种方法可以实现这一点:
- 如果可以,请从脚本开始该过程。当进程终止时,脚本将继续,这意味着它无法向文件写入更多数据
- 如果无法控制进程,但知道进程在写入文件后终止,则可以找出进程ID,然后检查进程是否仍在使用
运行。如果之后kill-0$PID
为$?
,则该进程仍处于活动状态0
- 如果不可能,则可以使用
获取此过程中所有打开文件的列表,并检查您的文件是否在列表中。不过,这有点慢lsof-np$PID
重命名可以确保其他所有人看到整个文件以及所有数据,或者什么也看不到。循环直到文件稳定为止。如果您正在等待实验结果,这应该可以工作(因此您不需要实时事件处理):
使用创建一个小型C程序。该计划应:
inotify
实例IN\u CLOSE\u WRITE
事件的实例添加一个监视您可以通过添加超时参数并允许指定不同的事件来扩展此功能。如何
!lsof--/path/to/file
?@RubyTuesdayDONO:那怎么办?我建议使用它作为一种更直接的方式来查询是否有任何进程打开了该特定文件(而不是通过最有可能的进程打开的所有文件的列表进行grep)。您关于在完成后将临时文件重命名到位的第二个建议似乎是一个更好的选择-我只想强调一下,lsof
是一个复杂的命令,有多个向量,可以精确地返回所需的信息。@RubyTuesdayDONO:Ah。我建议总是为这样的用例指定选项-n
,这样lsof
就不会花很多时间进行DNS查找。当使用带有文件名参数的strace
时(例如,cat>>file&strace-f-e trace=network lsof--file
),我没有在我的Fedora(OpenVZ)VPS上观察到任何DNS查找-尽管我同意,尽可能明确是一个好习惯,因为实现可能会有很大差异:]
EXPECTED_WRITE_INTERVAL_SECONDS=1
FILE="file.txt"
while : ; do
omod=$(stat -c %Y $FILE)
# echo "OLD: $omod"
sleep $EXPECTED_WRITE_INTERVAL_SECONDS
nmod=$(stat -c %Y $FILE)
# echo "NEW: $nmod"
if [ $omod == $nmod ] ; then
break
fi
done