我需要将输出重定向udevadm monitor
到命名管道。为此,我使用以下命令:
sudo socat -u SYSTEM:"udevadm monitor" PIPE:/tmp/test &
它会一直工作,直到从管道读取的进程被中断并socat
出现“管道损坏”错误(这是预期的)。但是,当我列出正在运行的进程时,结果发现该进程udevadm
仍在运行。
$ ps -a PID TTY 时间 CMD 3539 tty1 00:00:00 巴什 3619 tty2 00:00:00 巴什 3972 分/0 00:00:00 ps $ sudo socat -u 系统:“udevadm 监视器” 管道:/tmp/test & [1]3973 $ ps -a PID TTY 时间 CMD 3539 tty1 00:00:00 巴什 3619 tty2 00:00:00 巴什 3973 分/0 00:00:00 须藤 3974 分/0 00:00:00 索卡特 3975 分/0 00:00:00 索卡特 3976 分/0 00:00:00 乌德瓦德姆 3977 点/0 00:00:00 ps $猫/tmp/测试 监视器将打印收到的事件: UDEV - udev 在规则处理后发出的事件 KERNEL - 内核 uevent ^C $ 2020/06/01 12:36:06 socat[3974] E write(6, 0x1dfbc60, 147): 管道损坏 [1]+ 退出 1 sudo socat -u 系统:"udevadm 监视器" 管道:/tmp/test $ ps -a PID TTY 时间 CMD 3539 tty1 00:00:00 巴什 3619 tty2 00:00:00 巴什 3976 分/0 00:00:00 乌德瓦德姆 3980 分/0 00:00:00 ps $
当我替换udevadm monitor
为yes
(简单地向管道提供数据流)时,它与 一起消失了socat
。
如果我简单地socat
用kill
命令打断,udevadm
就会干净利落地灭亡。
如果我杀死父 bash 进程socat
并且udevadm
也死掉,所以我尝试udevadm
用以下内容包装sh -c
:
sudo socat -u SYSTEM:'sh -c \"udevadm monitor\"' PIPE:/tmp/test &
希望那垂死的壳能够杀死udevadm
,但无济于事。
我知道,孤儿进程可以被 INIT 采用,但情况似乎并非如此,因为在所有进程中似乎只有udevadm
这样欺骗死亡。总结一下我的实验:
- 进程树 bash->sudo->socat->udevadm -kill
socat
-全部死掉 - 进程树 bash->sudo->socat->udevadm - 管道损坏 - 只有 udevadm 存在
- 进程树 bash->sudo->socat->sh->udevadm - 管道损坏 - 只有 udevadm 存在
- 进程树 bash->sudo->socat->yes-管道破裂-全部死掉
- 进程树 bash->sudo->socat->udevadm - 杀死 sudo - 全部死掉
- 进程树 bash->sudo->socat->udevadm - 杀死 bash - 全部死掉
我真正想解决的问题是挥之不去的udevadm
进程。
我首选的解决方案是udevadm
与其他过程一起很好地消亡。可接受的解决方案是使用持久管道,当读取进程终止时该管道不会中断。
我可以传递任何选项或设置socat
来udevadm
解决我的问题吗?
如果socat
我的最终目标是将udevadm
输出发送到管道的工具是错误的,那么我显然愿意接受建议。
答案1
它似乎使用了一点魔法,但您可以尝试反转这两个地址,以便可以nofork
向系统命令添加选项。你需要切换-u
到-U
course 来改变方向:
socat -U PIPE:/tmp/test SYSTEM:"udevadm monitor",nofork
这似乎忽略了管道的关闭,您可以再次重新打开它。别问我魔法的事