Shell Daily 2026-01-25: 永不断流 (Tail Follow Name)
你是否有过这种经历:在终端挂着 tail -f access.log 监控线上流量,一切都很正常。突然,日志停止了滚动。你以为流量停了,或者服务挂了,吓得赶紧去查。结果发现服务跑得好好的,只是日志被轮转(Log Rotation)了。
传统的 tail -f 追踪的是文件描述符 (Inode)。当日志被切割(重命名为 .log.1 并创建新文件)时,你的 tail -f 还在傻傻地盯着那个已经不再写入的旧文件(Ghost File)。
是时候把 f 换成大写的 F 了。
怎么用
tail -F [filename]:不仅追踪文件内容,还追踪文件名。- 核心逻辑:当它发现文件“消失”或“不可访问”时,它不会退出,而是会不断重试(Retry),直到同名的新文件再次出现。
- 兼容性:POSIX 标准扩展。Linux (GNU) 和 macOS (BSD) 均支持。
适用场景
- 监控切割频繁的日志:如 Nginx、Systemd 或应用程序日志(通常每天或按大小切割)。
- 等待文件生成:在服务启动前就可以先运行
tail -F app.log,一旦文件被创建,日志立马显示。
示例 1:无惧轮转 (The Reliable Watcher)
这是生产环境监控日志的标准姿势。
# -n 0: 不看历史内容,只看最新产生的
# -F: 即使日志在 00:00 被切割,监控也不会断
$ tail -n 0 -F /var/log/nginx/access.log
示例 2:文件还没产生也能追
你想监控一个还没启动的程序的日志?用小 f 会直接报错退出。
# 笨办法:先 touch 一个空文件,再 tail -f
# 新技巧:直接 -F,它会提示 "cannot open... will retry"
$ tail -F /opt/app/startup.log
tail: cannot open... No such file or directory
# (一旦程序启动创建文件,内容自动出现)
INFO: Application started...
(注:把肌肉记忆里的 tail -f 改成 tail -F,你将永远告别“明明有流量却看了一个寂寞”的尴尬时刻。)