给定两个程序 A 和 B。
A 产生输出。
B 消耗输入。
在 Linux 上,您可以使用 A | 连接它们。 B
.
或者,如果我想拆分这些程序的执行,我可以使用命名管道:
mkfifo pipe
A > pipe &
B < pipe &
但是,如果我终止 B,A 也会被杀死。
有没有办法在多次重新启动B的同时将A连接到B? B 在不运行时丢失数据(例如在以下示例中被杀死期间)并不重要。 以下是我的目标,但它不起作用:
mkfifo pipe
A > pipe &
B > pipe &
kill B
B > pipe &
为什么我需要这个?
在我的例子中,A 是 Wireshark 的 JSON 输出,我正在开发 B 来解析正确的数据。
我想以交互方式执行此操作,但为此我需要 Wireshark(或 tshark
)来继续发送数据。
我知道 this 可能存在重复项和 that ,但是我的问题有所不同。我没有忘记将A重定向到其他地方,我可以提前准备一下。
最佳答案
A
在 B
终止时收到 SIGPIPE
。解决方法是:
exec 3<>pipe
A >&3 &
B <&3 &
这样,当 B
由于 fifo 已打开供另一个进程读取而死亡时,内核不会向 A
发出信号;即 B
不是最后一个从中读取的进程。
关于shell - 与命名管道分离而不终止源程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61427554/