如何将应用标准输出重定向到Unix Socket?测试报错求助
将进程标准输出重定向到Unix Socket的方法
当然可以把应用输出重定向到Unix Socket,但不能直接用普通的文件重定向符号>——Unix Socket不是普通文件,它需要先建立套接字连接,而非像读写普通文件那样直接打开。你遇到的No such device or address错误,就是因为bash尝试把它当作普通文件打开,而实际上这是套接字类型的特殊文件,无法用普通方式写入。
下面是两种可行的实现方式:
方法一:使用socat工具(推荐)
socat是专门处理套接字和数据流的工具,能轻松实现进程输出到Unix Socket的转发。执行以下命令即可:
ping 127.0.0.1 | socat - UNIX-CONNECT:/tmp/unixsockettest.sock
这里的-代表读取标准输入(即ping的输出),UNIX-CONNECT指定要连接的Unix Socket路径,socat会负责建立连接并把数据转发给服务器。
方法二:使用bash文件描述符
如果不想额外安装工具,可以用bash的文件描述符功能手动建立套接字连接:
- 先在bash中执行命令,打开Unix Socket连接并绑定到文件描述符3:
exec 3<>/tmp/unixsockettest.sock
- 然后把进程的标准输出重定向到这个文件描述符:
ping 127.0.0.1 >&3
- 当不需要连接时,关闭文件描述符:
exec 3>&-
注意事项
- 确保你的Unix Socket服务器已经启动并监听指定路径,否则上述命令会连接失败。
- 如果服务器意外关闭,
/tmp/unixsockettest.sock文件会残留,下次启动服务器前需要手动删除该文件,否则会出现Address already in use错误。
内容的提问来源于stack exchange,提问作者Semyon Bayandin
相关产品推荐
相关产品推荐

