Process

如果父程序遇到錯誤,udevadm 不會死

  • June 1, 2020

我需要將輸出重定向udevadm monitor到命名管道。為此,我使用以下命令:

sudo socat -u SYSTEM:"udevadm monitor" PIPE:/tmp/test &

它一直工作,直到從管道讀取的程序被中斷並socat存在預期的“Broken pipe”錯誤。但是,當我列出正在執行的程序時,事實證明它udevadm仍在執行。

$ ps -a
PID TTY 時間命令
3539 tty1 00:00:00 重擊
3619 tty2 00:00:00 狂歡
3972 點/0 00:00:00 ps
$ sudo socat -u SYSTEM:"udevadm 監視器" PIPE:/tmp/test &
[1] 3973
$ ps -a
PID TTY 時間命令
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 SYSTEM:"udevadm monitor" PIPE:/tmp/test
$ ps -a
PID TTY 時間命令
3539 tty1 00:00:00 重擊
3619 tty2 00:00:00 狂歡
3976 分/0 00:00:00
3980 點/0 00:00:00 ps
$

當我替換udevadm monitoryes(簡單地向管道提供數據流)時,它與socat.

socat如果我只是簡單地用kill命令打斷,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- all die
  2. 程序樹 bash->sudo->socat->udevadm - 損壞的管道 - 只有 udevadm 存在
  3. 程序樹 bash->sudo->socat->sh->udevadm - 損壞的管道 - 只有 udevadm 存在
  4. 程序樹 bash->sudo->socat->yes- 破管 - 全部死掉
  5. 程序樹 bash->sudo->socat->udevadm - kill sudo - all die
  6. 程序樹 bash->sudo->socat->udevadm - kill bash - all die

我真正想解決的問題是揮之不去的udevadm過程。

我首選的解決方案是udevadm與其他程序一起很好地消亡。可接受的解決方案是擁有持久管道,當讀取過程終止時不會中斷。

是否有任何選項或設置可以傳遞給socatudevadm來解決我的問題?

如果socat我的最終目標是錯誤的工具將udevadm輸出發送到管道,我顯然願意接受建議。

它似乎使用了一點魔法,但您可以嘗試反轉這兩個地址,這樣您就可以nofork在系統命令中添加選項。你當然需要換-u-U改變方向:

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

這似乎忽略了管道的關閉,您可以再次打開它。不要問我關於魔法的事。

引用自:https://unix.stackexchange.com/questions/590238