前段时间我注意到,当文件保存到 NFS 挂载和本地文件系统时,inotify 报告的事件是不同的。
底层 VFS 不应该提供文件操作的统一视图吗?
以下是 Debian 7.1 (Linux 3.2) 中 VIM 保存文件的轨迹
在 NFS 挂载上:
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)
wd=1 mask = 4 (IN_ATTRIB)
wd=1 mask = 1024 (IN_DELETE_SELF)
wd=1 mask = 32768 )
Run Code Online (Sandbox Code Playgroud)
在本地文件系统上
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 8 (IN_CLOSE_WRITE)
wd=1 mask = 4 (IN_ATTRIB)
Run Code Online (Sandbox Code Playgroud)
使用 …
我想要做的是,监视一个目录(不是递归的,只有一个)以创建新文件,并将这些文件在写入时附加到一个大文件中。
正在写入的文件数量巨大,可能高达 50,000。
通过使用inotifywait
,我正在监视目录,例如:
inotifywait -m -e create ~/folder | awk '($2=="CREATE"){print $3}' > ~/output.file
Run Code Online (Sandbox Code Playgroud)
所以我存储了创建的新文件的名称,~/output.file
然后使用 for 循环
for FILE in `cat ~/output.file`
do
cat $FILE >> ~/test.out
done
Run Code Online (Sandbox Code Playgroud)
如果写入(创建)文件的速率~/folder
类似于每秒 1 个文件,则它工作正常。
但是要求很大,而且创建文件的速度非常高,比如每分钟 500 个文件(甚至更多)。
我检查了~/folder
进程完成后的文件数,但它与inotifywait
输出不匹配。有 10-15 个文件的差异,各不相同。
此外,循环
for FILE in `cat ~/output.file`
do
done
Run Code Online (Sandbox Code Playgroud)
不会在~/output.file
写入时处理所有文件。
任何人都可以建议我解决这个问题的优雅解决方案吗?
简短的故事是,我可能需要一个简单的 bash 循环,它会定期检查给定文件的大小自上次检查以来是否发生了变化。
长话短说,我将使用 Firefox下载文件my_file.txt。我想在下载完成后运行一个命令。Firefox 似乎没有提供我可以使用的 dbus 调用。存在一些具有上述功能的附加组件,但我需要一个相当可靠的解决方案。所以我想我可以运行一个 bash 脚本来定期检查my_file.txt的大小是否随着时间的推移而变化,或者已经稳定下来。该文件是一个大小 <=5mb 的文本文件,将在本地下载,因此它非常可靠并且下载应该线性运行(没有断开连接、服务器问题等)。
你能帮我写一个这么简单的bash脚本吗?探测文件的频率似乎确实是使事情有效工作的关键。就像我说的,它是一个 <=5mb 的文本文件,但可以小到 10kb,驻留在 SSD 驱动器上。
另外,也许有更好的方法来实现这一目标?就像我说的,我需要一个可靠的解决方案,它可以在 Linux 中以最少的依赖运行。也许是下载管理器?或者任何文件监控守护进程?或者为此提供文件系统API?或者使用访问时间而不是大小?