AC/배터리 플러그/분리 이벤트에서 명령을 시작하는 udev 규칙

AC/배터리 플러그/분리 이벤트에서 명령을 시작하는 udev 규칙

배터리를 절약하기 위해 랩톱이 배터리로 실행될 때마다 효과(합성기)를 끄고 싶습니다. 나는 udev 규칙으로 이것을 달성하려고 생각했습니다.

  • 파일을 생성했습니다 /etc/udev/rules.d/99-myrule.rules:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"

이 규칙은 노트북에서 AC를 연결하거나 연결을 끊을 때마다 실행됩니다.

그런 다음 다음을 사용하여 규칙을 업데이트합니다.sudo udevadm control -R

안타깝게도 전원 공급 장치를 연결/분리할 때 아무 것도 트리거되지 않습니다.

내 시스템은 아치 리눅스입니다.

답변1

요약:

  1. AC 연결이 끊어지면 응용 프로그램(compton)을 종료하는 스크립트를 실행하는 udev 규칙을 만듭니다.

  2. 다시 시작하는 것은 간단하지 않습니다. systemd 서비스를 만들어 앱을 시작한 다음 udev 규칙을 사용하여 해당 서비스를 시작하세요.

  3. udev 규칙을 테스트하려면 다음을 사용하세요.udevadm control --reload-rules && udevadm trigger


답변:

그래서 나는 효과적인 해결책을 찾았습니다. 질문은 2가지 질문으로 구성되었으므로 질문을 나누어 보겠습니다.

  1. AC/배터리 연결/분리 시 실행되는 udev 규칙을 작성합니다.
  2. udev 규칙에서 compton과 같은 GUI 애플리케이션을 시작하는 방법.

AC/배터리 연결/분리에서 실행되는 udev 규칙을 작성합니다.

파일 생성 /etc/udev/rules.d/60-onbattery.rules:

# Rule for when switching to battery
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="0",RUN+="/bin/killcompton.sh"

파일을 생성합니다 /etc/udev/rules.d/61-onpower.rules.

# Rule for when switching to powersupply
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/startcompton.sh"

POWER_SUPPLY_ONLINE주변 환경이 어떤지 주목하세요 .ENV{...}

또한 자신의 규칙에 대한 속성을 알고 싶다면 udev에 표시되는 내용을 모니터링하세요. udevadm monitor --environment

스크립트가 단순히 백그라운드 작업이고 GUI 관련 프로세스를 호출하지 않는다면 완료된 것입니다! 그렇지 않은 경우 계속 읽으십시오.

udev 규칙에서 compton과 같은 GUI 애플리케이션을 시작하는 방법:

에서udev 남자RUN 사용에 대해:

"이것은 매우 짧은 실행 작업에만 사용할 수 있습니다..."

이는 우리가 다음과 같은 지속적인 것을 사용해야 함을 의미합니다.체계화된서비스. 서비스 파일 생성: /etc/systemd/system/compton.service:

[Unit]
Description=Start compton

[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=%h/.Xauthority"
User=USERNAME
ExecStart=/bin/compton --blur-method kawase --write-pid-path %t/compton.pid
PIDFile=%t/compton.pid

[Install]
WantedBy=default.target

USERNAME사용자 이름으로 바꾸십시오 .

%h및 지정자는 and 또는 %t으로 대체됩니다 . 자세한 내용은 을 참조하세요 .$HOME/run$XDG_RUNTIME_DIRsystemd.unit(5)

Environment="XAUTHORITY=/home/USERNAME/.Xauthority"GUI 애플리케이션을 원한다면 이 라인 은 필수입니다. 참조하세요이 답변.

마지막으로 udev 규칙에서 GUI 애플리케이션(이 경우 compton)을 시작하는 대신 서비스를 시작합니다.

SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/systemctl start compton"

답변2

기존 답변으로 시작했지만 최종 결과를 공유하겠다고 생각했습니다. 제 사용 사례는 노트북의 AC 전원이 끊겼을 때 무언가(실제로는 이상한 PSU 문제로 인해 스마트 플러그/릴레이의 전원을 껐다 켜는 것)를 수행하는 것이었습니다.

udev 규칙은 여러 줄로 구성되어서는 안 되고, 그렇다면 이스케이프되어야 하기 때문에 문제가 발생했습니다.

내가 한 일은 다음과 같습니다.

# cat /etc/udev/rules.d/90-onbattery.rules                                                                                                                                                                                   
SUBSYSTEM=="power_supply",\
  ENV{POWER_SUPPLY_NAME}=="ADP1",\
  ENV{POWER_SUPPLY_ONLINE}=="0",\
  RUN+="/usr/bin/systemctl start power-cycle-outlet.service"
# cat /etc/systemd/system/power-cycle-outlet.service                                                                                                                                                                         
[Unit]
Description=Power Cycle Outlet via Home Assistant

[Service]
User=root
Type=simple
GuessMainPID=false
ExecStart=/usr/sbin/trigger-outlet-powercycle.sh

trigger-outlet-powercycle.sh샌드박스로 인해 udev에서 직접 호출할 수 없도록 네트워크 호출을 수행하고 at작동할 수 없었지만 systemd는 제대로 작동했습니다.

위 사항을 개선하는 데 사용할 수 있는 흥미로운 리소스:

관련 정보