我有一个开始写入文件的外部进程。
如何编写等待文件关闭之前的脚本(当其他过程完成写入时)。
答案 0 :(得分:3)
有几种方法可以实现这一目标:
如果可以,请从脚本启动该过程。当进程终止时,脚本将继续运行,这意味着它无法再将更多数据写入文件。
如果您无法控制流程,但是您知道该流程在写入文件后终止,则可以找到流程ID,然后检查流程是否仍在使用kill -0 $PID
运行。如果之后$?
为0
,则该过程仍然有效。
如果无法做到这一点,那么您可以使用lsof -np $PID
获取此过程的所有打开文件的列表,并检查您的文件是否在列表中。但这有点慢。
[编辑] 请注意,所有这些方法都有点脆弱。正确的解决方案是让外部进程使用临时名称写入文件,然后在完成后立即重命名。
重命名确保其他所有人都可以看到包含所有数据的整个文件,或者没有任何内容。
答案 1 :(得分:2)
简单的方法:让脚本执行程序并等到它完成。
答案 2 :(得分:2)
使用inotify
创建一个小型C程序。该计划应该:
inotify
个实例。IN_CLOSE_WRITE
事件添加一个监视实例。然后在您的脚本中,以文件路径作为参数调用程序。
您可以通过添加超时参数来扩展它,并允许指定不同的事件。
答案 3 :(得分:1)
这不好看,它让我觉得写它很脏... /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;
答案 4 :(得分:0)
循环直到文件稳定接近,如果您正在等待实验结果,这应该可行(因此您不需要实时事件处理):
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