You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何持续读取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

内容的提问来源于stack exchange,提问作者Melab

火山引擎 最新活动