我有一个外部进程开始写入文件。
如何编写等待文件关闭的脚本(当写入其他进程时)。如何等到文件关闭
Q
如何等到文件关闭
6
A
回答
3
有几种方法来实现这一目标:
如果可以,请从脚本启动该过程。当进程终止时,脚本将继续运行,这意味着它无法再向该文件写入更多数据。
如果您无法控制进程但您知道进程在写入文件后终止,则可以找出进程标识,然后检查进程是否仍在运行
kill -0 $PID
。如果$?
之后为0
,则该过程仍然存在。如果这是不可能的,那么您可以使用
lsof -np $PID
来获取此进程的所有打开文件的列表,并检查您的文件是否在列表中。虽然这有点慢。
[编辑]注意,所有这些方法都是有点脆。正确的解决方案是让外部进程使用临时名称写入文件,然后在完成后立即对其进行重命名。
重命名确保每个人都可以看到整个文件的所有数据或没有。
2
简单的方法:让脚本执行程序并等待它完成。
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;
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
1
创建使用inotify
一个小的C程序。程序应该:
- 创建一个
inotify
实例。 - 为感兴趣的文件路径添加关于
IN_CLOSE_WRITE
事件的实例的手表。 - 等待事件发生。
- 使用适当的代码退出。
然后在您的脚本中,以文件路径作为参数调用该程序。
您可以通过添加一个超时参数来扩展它,并允许指定不同的事件。
相关问题
- 1. 等到用户关闭文件
- 2. 等到QWidget关闭
- 3. 如何等待文件流完成写入之前关闭它?
- 4. 如何等待文件关闭在批处理文件比继续执行
- 5. 如何关闭等待服务器?
- 6. 如何写入文本文件,直到应用程序关闭
- 7. 如何从C#关闭PDF文件#
- 8. 如何使用pywinauto关闭Excel文件
- 9. 如何通过编号关闭文件?
- 10. 如何关闭Java Nio文件写入
- 11. 如何关闭tempfile.mkstemp中的文件?
- 12. Python xlrd.Book:如何关闭文件?
- 13. 如何关闭播放音频文件
- 14. 文件不关闭
- 15. newOutputStream关闭文件
- 16. 扭曲,等到连接关闭干净
- 17. pylab matplotlib“show”等到窗口关闭
- 18. FLTK等待事件关闭窗口
- 19. Java - catch PC关闭事件或等效
- 20. 如何关闭jquery插件
- 21. 阻塞,直到文件被关闭python
- 22. 如何关闭C语言文件中不保存信息到文件
- 23. 如何关闭导入文件中的文件Python
- 24. 如何在向后读取文件后关闭文件?
- 25. 如何在不关闭文件的情况下覆盖文件
- 26. Ruby:如何在脚本中调用文件后关闭文件
- 27. 制作的Atom CLI等待文件被关闭
- 28. Javascript不等待文件对话框关闭
- 29. 在继续之前等待批处理文件关闭 - VB.net
- 30. Qt:等待文件被另一个进程关闭
'! lsof -/path/to/file'? – RubyTuesdayDONO 2013-12-24 04:39:00
@RubyTuesdayDONO:那呢? – 2014-01-08 09:27:44
我认为它是一种更直接的方式来查询是否有任何进程打开该特定文件(与通过最可能进程打开的所有文件的列表进行“grep”打开)。你的第二个建议是在完成后重新命名临时文件,看起来像是一个更好的选择 - 我只想强调一下,'lsof'是一个复杂的命令,带有多个向量,用于准确地获取所需的信息。 – RubyTuesdayDONO 2014-01-09 01:19:20