상위 프로세스에 오류가 발생하면 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:00ps
$ sudo socat -u 시스템: "udevadm monitor" 파이프: /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 min/0 00:00:00 우드바뎀
 3977포인트/0 00:00:00ps
$cat/tmp/테스트
모니터는 수신된 이벤트를 인쇄합니다.
UDEV - 규칙 처리 후 udev에서 발생하는 이벤트
커널 - 커널 uevent

^C
$ 2020/06/01 12:36:06 socat[3974] E write(6, 0x1dfbc60, 147): 파이프 손상

[1]+ 1번 출구 sudo socat -u 시스템: "udevadm monitor" 파이프:/tmp/test
$ ps -a
  PID TTY 시간 CMD
 3539 tty1 00:00:00 강타
 3619 tty2 00:00:00 강타
 3976 min/0 00:00:00 우드바뎀
 3980분/0 00:00:00ps
$

udevadm monitor로 교체했을 때 yes(단순히 데이터 스트림을 파이프에 공급) 와 함께 사라졌습니다 socat.

그냥 명령 socat으로 방해하면 깔끔하게 죽습니다.killudevadm

상위 bash 프로세스를 종료하면 프로세스도 종료 socat되므로 다음으로 래핑 udevadm해 보았습니다 .udevadmsh -c

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

죽어가는 껍질이 죽을 것이라고 기대했지만 udevadm소용이 없었습니다.

나는 고아 프로세스가 INITed될 수 있다는 것을 알고 있지만 그것이 모든 프로세스 중에서 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-pipeburst-all dead
  5. 프로세스 트리 bash->sudo->socat->udevadm - sudo 종료 - 모두 죽습니다.
  6. 프로세스 트리 bash->sudo->socat->udevadm - kill bash - 모두 죽습니다.

제가 정말로 해결하고 싶은 문제는 느린 udevadm과정입니다.

내가 선호하는 솔루션은 udevadm다른 프로세스와 함께 멋지게 죽는 것입니다. 허용되는 해결책은 읽기 프로세스가 종료될 때 끊어지지 않는 영구 파이프를 사용하는 것입니다.

문제를 해결하기 socat위해 전달할 수 있는 옵션이나 설정이 있습니까 ?udevadm

출력을 파이프로 보내는 socat궁극적인 목표가 잘못된 경우 제안을 받아들일 수 있습니다.udevadm

답변1

약간의 마법을 사용하는 것처럼 보이지만 두 주소를 반대로 바꾸어 nofork시스템 명령에 옵션을 추가할 수 있습니다. 방향을 바꾸려면 코스 -u로 전환해야 합니다 .-U

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

이는 파이프 닫기를 무시하는 것으로 보이며 다시 열 수 있습니다. 마법에 대해 묻지 마세요

관련 정보