udev 규칙을 추가하면 시스템 네트워크 시간 초과가 발생합니다.

udev 규칙을 추가하면 시스템 네트워크 시간 초과가 발생합니다.

내 노트북이 충전기에 연결되어 있거나 연결이 끊어졌을 때 udev가 특정 스크립트를 실행하도록 하려고 합니다.

이를 위해 파일을 만들고 99-local.rules다음 /etc/udev/rules.d내용을 넣었습니다.

ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/sbin/onchg.sh"
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/sbin/onbatt.sh"

그러나 파일이 제 위치에 있으면 시스템은 "네트워크 인터페이스 상승" 대상 동안 잠시 정지된 것처럼 보이며 표시된 5분 중 2분 후에 시간이 초과됩니다.

파일을 삭제하면 잘 작동됩니다.

udev는 네트워크 인터페이스 시작과 어떤 관련이 있으며 어떻게 가능한 한 빨리 시작하면서도 이러한 규칙을 유지할 수 있습니까?

답변1

udevadm settle출력에는 다음과 같은 관계가 있습니다 systemctl cat networking.

ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ] && udevadm settle'

man udev에 대해 다음을 고려하십시오 .RUN

이는 매우 단기적으로 실행되는 포그라운드 작업에만 사용할 수 있습니다. 장기 실행 이벤트 프로세스는 해당 장치 또는 슬레이브 장치에 대한 모든 추가 이벤트를 차단할 수 있습니다.

데몬이나 기타 장기 실행 프로세스를 시작하는 것은 udev에 적합하지 않습니다. 분리 여부에 관계없이 분기된 프로세스는 이벤트 처리가 완료된 후 무조건 종료됩니다.

답변2

Ferenc가 제공한 답변은 문제가 내 스크립트와 관련이 있을 수 있다는 단서를 제공했습니다.

실제로 노트북을 도킹/도킹 해제할 때마다 스크립트는 GPU를 전환하고 X 서버(LightDM)를 다시 시작해야 합니다.

따라서 udev가 시작 중에 스크립트를 실행한 것 같아서 X를 다시 시작하려고 시도했지만 분명히 실패했습니다.

onbat.sh/ 상단에 다음 코드를 추가했는데 onchg.sh이제 모든 것이 잘 작동합니다.

# Check if LightDM has already arrived
systemctl status lightdm | grep "running"
not_running=$?
if (( $not_running > 0 ))
then
    # LightDM not arrived, exiting for now...
    echo "LightDM not arrived, won't switch GPU."
    exit
fi

관련 정보