shell - 从命名管道中分离而不终止源程序
问题描述
给定两个程序 A 和 B。A 产生输出。B 消耗输入。在 Linux 上,您可以将它们与A | B
.
或者,如果我想拆分这些程序的执行,我可以使用命名管道:
mkfifo pipe
A > pipe &
B < pipe &
但是,如果我终止 B,A 也会被杀死。
有没有办法将A连接到B,同时重新启动B多次?B 在不运行时丢失数据(例如,在以下示例中被杀死期间)并不重要。以下将是我的目标,但它不起作用:
mkfifo pipe
A > pipe &
B > pipe &
kill B
B > pipe &
为什么我需要这个?
在我的例子中,A 是 Wireshark 的 JSON 输出,我正在开发 B 来解析正确的数据。我想以交互方式进行,但为此我需要 Wireshark(或tshark
)继续发送数据。
解决方案
A
收到一个SIGPIPE
时刻B
终止。一种解决方法是:
exec 3<>pipe
A >&3 &
B <&3 &
A
这样,当B
fifo 被另一个进程打开以供读取时,内核不会发出信号;即B
不是从它读取的最后一个过程。
推荐阅读
- c - 带单引号的字符数组如何影响不带引号的字符数组?
- keyboard - 键盘未出现在 ios 13 的谷歌登录页面
- javascript - 从值为 xml 的属性中获取值
- django - 未找到与查询匹配的帖子
- google-bigquery - BigQuery 计划查询:当目标数据集位于 > REGION_ASIA_SOUTHEAST_1 时,无法在 > JURISDICTION_US 中创建转移
- php - PHP 无法从 jQuery 动态方法中获取 post 数据
- python - 如何在python中将文件名作为字符串变量插入mysql数据库
- reactjs - Gradle Jar 创建任务卡住了
- javascript - 如何在全局scss文件中实现绝对路径?VueJS
- maven - 用于 Scala 单例对象的 Jacoco 插件两次覆盖相同的类并创建覆盖率不足