如果父进程遇到错误,udevadm 不会终止

如果父进程遇到错误,udevadm 不会终止

我需要将输出重定向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 monitoryes(简单地向管道提供数据流)时,它与 一起消失了socat

如果我简单地socatkill命令打断,udevadm就会干净利落地灭亡。

如果我杀死父 bash 进程socat并且udevadm也死掉,所以我尝试udevadm用以下内容包装sh -c

sudo socat -u SYSTEM:'sh -c \"udevadm monitor\"' PIPE:/tmp/test &

希望那垂死的壳能够杀死udevadm,但无济于事。

我知道,孤儿进程可以被 INIT 采用,但情况似乎并非如此,因为在所有进程中似乎只有udevadm这样欺骗死亡。总结一下我的实验:

  1. 进程树 bash->sudo->socat->udevadm -kill socat-全部死掉
  2. 进程树 bash->sudo->socat->udevadm - 管道损坏 - 只有 udevadm 存在
  3. 进程树 bash->sudo->socat->sh->udevadm - 管道损坏 - 只有 udevadm 存在
  4. 进程树 bash->sudo->socat->yes-管道破裂-全部死掉
  5. 进程树 bash->sudo->socat->udevadm - 杀死 sudo - 全部死掉
  6. 进程树 bash->sudo->socat->udevadm - 杀死 bash - 全部死掉

我真正想解决的问题是挥之不去的udevadm进程。

我首选的解决方案是udevadm与其他过程一起很好地消亡。可接受的解决方案是使用持久管道,当读取进程终止时该管道不会中断。

我可以传递任何选项或设置socatudevadm解决我的问题吗?

如果socat我的最终目标是将udevadm输出发送到管道的工具是错误的,那么我显然愿意接受建议。

答案1

它似乎使用了一点魔法,但您可以尝试反转这两个地址,以便可以nofork向系统命令添加选项。你需要切换-u-Ucourse 来改变方向:

socat -U PIPE:/tmp/test SYSTEM:"udevadm monitor",nofork

这似乎忽略了管道的关闭,您可以再次重新打开它。别问我魔法的事

相关内容