Process
如果父程序遇到錯誤,udevadm 不會死
我需要將輸出重定向
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 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
- all die- 程序樹 bash->sudo->socat->udevadm - 損壞的管道 - 只有 udevadm 存在
- 程序樹 bash->sudo->socat->sh->udevadm - 損壞的管道 - 只有 udevadm 存在
- 程序樹 bash->sudo->socat->yes- 破管 - 全部死掉
- 程序樹 bash->sudo->socat->udevadm - kill sudo - all die
- 程序樹 bash->sudo->socat->udevadm - kill bash - all die
我真正想解決的問題是揮之不去的
udevadm
過程。我首選的解決方案是
udevadm
與其他程序一起很好地消亡。可接受的解決方案是擁有持久管道,當讀取過程終止時不會中斷。是否有任何選項或設置可以傳遞給
socat
或udevadm
來解決我的問題?如果
socat
我的最終目標是錯誤的工具將udevadm
輸出發送到管道,我顯然願意接受建議。
它似乎使用了一點魔法,但您可以嘗試反轉這兩個地址,這樣您就可以
nofork
在系統命令中添加選項。你當然需要換-u
到-U
改變方向:socat -U PIPE:/tmp/test SYSTEM:"udevadm monitor",nofork
這似乎忽略了管道的關閉,您可以再次打開它。不要問我關於魔法的事。