如何持续读取FIFO/Socket路径内容,避免命令自动退出?
解决持续读取FIFO/Unix Socket不退出的问题
核心需求是持续读取/run/thing(FIFO或Unix Socket),不因单次写入结束而退出,直到手动终止进程。以下分场景给出解决方案:
针对FIFO的方案
cat /run/thing会在写入端关闭后退出,原因是FIFO的读取端会在所有写入端断开后收到EOF,进而终止进程。可以用以下方法避免:
- 循环读取法
用shell循环反复打开FIFO读取,写入端关闭后自动重新等待:
while true; do cat /run/thing; done
运行后会一直保持,按Ctrl+C或kill命令才能终止,每次写入内容都会实时打印。
- tail跟踪法
tail -f可以持续跟踪FIFO的写入,即使写入端关闭也不会退出:
tail -f /run/thing
部分系统可能需要添加--follow=name参数,确保跟踪路径而非文件描述符:
tail --follow=name /run/thing
- socat工具法
socat支持非阻塞读取,能稳定保持进程运行:
socat -u OPEN:/run/thing,rdonly,nonblock STDOUT
-u表示单向读取,nonblock确保无写入时也不会阻塞退出。
针对Unix Domain Socket的方案
如果/run/thing是Unix Socket,推荐用nc或socat监听:
- nc(netcat)
用-lU参数开启监听,持续等待客户端连接并输出数据:
nc -lU /run/thing
每次有客户端发送数据后,nc会继续保持监听状态,不会退出。
- socat工具法
创建并监听Unix Socket,实时输出收到的所有数据:
socat UNIX-LISTEN:/run/thing STDOUT
进程会一直运行到手动终止,Socket文件会在进程退出后保留,下次使用前需手动删除(rm /run/thing)。
补充操作
- 若未创建FIFO,先执行
mkfifo /run/thing;Unix Socket无需提前创建,监听工具会自动生成。 - 测试写入:
- FIFO:
echo "测试内容" > /run/thing - Unix Socket:
echo "测试内容" | nc -U /run/thing
- FIFO:
内容的提问来源于stack exchange,提问作者Melab




