命名管道(FIFO)是Linux中用于解耦无亲缘进程的单向文件流通信机制,通过mkfifo创建、p开头权限标识、阻塞式读写实现生产者-消费者同步,并广泛应用于日志分流、监控桥接与安全隔离等运维场景。

命名管道(FIFO)在 Linux 运维中主要用于解耦无亲缘关系的进程,实现稳定、可控的单向文件流数据传输。它不依赖进程启动顺序,也不需要网络或复杂配置,适合日志转发、监控采集、脚本协同等场景。
创建与权限设置
运维中最常用的是命令行方式创建 FIFO 文件:
- 执行 mkfifo /var/run/log_pipe 创建命名管道,路径建议选在
/var/run(tmpfs,重启自动清理)或/tmp; - 默认权限受 umask 影响,若需确保其他用户可读写,显式指定权限: mkfifo -m 666 /var/run/log_pipe;
- 用 ls -l /var/run/log_pipe 验证,输出首字符为 p(如
prw-rw-rw-),表示是 FIFO 文件。
阻塞式读写的基本流程
FIFO 默认行为是阻塞打开,这对运维脚本协作很友好——它天然实现“生产者-消费者”同步:
- 读端先运行:cat /var/run/log_pipe | grep "ERROR",此时会挂起,直到有写端打开;
- 写端后运行:echo "ERROR: disk full" > /var/run/log_pipe,读端立即收到并处理;
- 注意:不能用
>直接覆盖写入(那是截断普通文件),必须用>或>>向 FIFO 写,且写入后需关闭句柄,否则读端可能卡住。
避免常见挂起问题
运维中容易因打开方式不当导致脚本卡死,关键点在于理解 open 行为:
- 只读打开(
cat /path)会等待至少一个写端 open;只写打开(echo ... > /path)会等待至少一个读端 open; - 若需非阻塞启动(例如守护进程预热),加 O_NONBLOCK:用 dd if=/dev/zero of=/var/run/log_pipe bs=1 count=0 2>/dev/null 触发一次非阻塞写打开,或在 C/Python 脚本中用
os.open(..., os.O_WRONLY | os.O_NONBLOCK); - 写端退出后,读端
read()返回 0(EOF),但 FIFO 文件本身仍存在,可被新进程复用。
典型运维组合用法
把 FIFO 当作轻量级消息中继,无需额外服务:
-
日志分流:让
rsyslog模块写入 FIFO,另一脚本实时过滤告警并推送钉钉; - 监控数据桥接:Zabbix Agent 输出 JSON 到 FIFO,Python 脚本读取解析后写入 InfluxDB;
- 安全隔离:低权限应用写 FIFO,高权限守护进程读取并校验后执行操作,避免直接暴露控制接口。


















