내 노트북이 충전기에 연결되어 있거나 연결이 끊어졌을 때 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