在 Linux 系统中,监视文件(监控文件的变化、创建、删除、修改等)是一个常见的需求,常用于日志分析、自动化部署、同步数据等场景。
以下是几种常用的方法,从简单到高级排列:
tail -f:监视文件内容变化(最常用)
适用于实时查看日志文件或文本内容的追加。
tail -f /var/log/syslog
- 功能:实时显示文件末尾的内容,当有新内容写入时自动刷新。
- 常用参数:
-f:持续跟踪文件。-F:类似-f,但如果文件被删除或重命名,它会等待文件重新创建(适合日志轮转场景)。--pid=PID:当指定进程结束时退出监视。
inotifywait:监视文件系统事件(推荐)
这是 inotify-tools 包中的一个工具,可以监视文件的元数据变化(如修改、创建、删除、权限更改等),而不仅仅是内容追加。
安装
# Ubuntu/Debian sudo apt install inotify-tools # CentOS/RHEL sudo yum install inotify-tools
基本用法
# 监视单个文件的变化 inotifywait -m /path/to/file # 监视目录及其子目录 inotifywait -m -r /path/to/dir
常用参数
-m:持续监视(monitor),不退出。-r:递归监视子目录。-e:指定监视的事件类型,如modify,create,delete,move,attrib等。-q:安静模式,减少输出。
示例:监视文件修改并执行命令
inotifywait -m -e modify /path/to/file | while read path action file; do
echo "文件 $file 被修改了"
# 在这里执行你的脚本,例如重启服务
sudo systemctl restart myservice
done
常见事件类型
CREATE:文件或目录被创建。DELETE:文件或目录被删除。MODIFY被修改。MOVE:文件或目录被移动。ATTRIB:文件属性(如权限、时间戳)被修改。
watch:定期执行命令并显示结果
适用于周期性检查文件状态(如大小、权限、时间戳)。
# 每2秒显示一次文件信息 watch -n 2 ls -l /path/to/file # 监视文件大小变化 watch -n 1 stat /path/to/file
- 优点:简单直观,适合人类观察。
- 缺点:不是实时事件驱动,而是轮询方式,可能有延迟。
find + watch 或脚本:复杂监视
如果需要更复杂的逻辑(如监视多个文件、特定条件),可以结合 find 和 while 循环。
# 监视目录下所有 .log 文件的修改时间
while true; do
find /path/to/dir -name ".log" -newer /tmp/last_check -exec ls -l {} ;
touch /tmp/last_check # 更新参考时间
sleep 5
done
高级工具:entr 或 fswatch
entr(Event Notify Tool)
- 简单易用,适合执行命令。
- 安装:
sudo apt install entr - 用法:
ls .c | entr -d gcc -o main main.c # 当 .c 文件变化时,自动重新编译
fswatch
- 跨平台,支持多种后端(inotify, FSEvents, kqueue 等)。
- 适合需要跨平台兼容性的场景。
总结对比
| 工具 | 适用场景 | 实时性 | 复杂度 | 是否事件驱动 |
|---|---|---|---|---|
tail -f |
查看日志内容追加 | 高 | 低 | 是 |
inotifywait |
监视文件元数据变化(创建/删除/修改) | 高 | 中 | 是 |
watch |
周期性检查文件状态 | 中(轮询) | 低 | 否 |
entr |
文件变化时执行命令 | 高 | 低 | 是 |
fswatch |
跨平台文件监视 | 高 | 中 | 是 |
推荐选择
- 只看日志内容:用
tail -f。 - 需要响应文件创建/删除/修改事件:用
inotifywait。 - 文件变化时自动执行脚本:用
inotifywait或entr。 - 简单查看文件状态:用
watch。
如果你有具体的使用场景(监视某个目录下的新文件并上传到服务器),可以提供更多细节,我可以为你编写具体的脚本。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/480643.html



