Правило udev для запуска команды при подключении/отключении переменного тока/аккумулятора

Правило udev для запуска команды при подключении/отключении переменного тока/аккумулятора

Чтобы сэкономить заряд батареи, я бы хотел отключать эффекты (композитор) всякий раз, когда ноутбук работает от батареи. Я думал сделать это с помощью правил udev.

  • Создал файл /etc/udev/rules.d/99-myrule.rules:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"

Это правило должно срабатывать каждый раз, когда вы подключаете/отключаете блок питания от ноутбука.

Затем я обновляю правила следующим образом:sudo udevadm control -R

К сожалению, это не приводит к каким-либо сбоям при подключении/отключении моего источника питания.

Моя система — Arch Linux.

решение1

TL;DR:

  1. Создайте правило udev, которое будет выполнять скрипт для завершения работы вашего приложения (compton) при отключении питания.

  2. Запустить его снова не так-то просто — создайте службу systemd для запуска вашего приложения, а затем используйте правило udev для запуска этой службы.

  3. Чтобы проверить ваши правила udev, используйтеudevadm control --reload-rules && udevadm trigger


Отвечать:

Итак, я нашел работающее решение. Вопрос состоял из 2 вопросов, поэтому давайте разберем его:

  1. Напишите правило udev для запуска при подключении/отключении питания/аккумулятора.
  2. Как запустить графическое приложение, например Compton, из правила Udev.

Напишите правило 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

Если ваш скрипт — это просто фоновая задача, не вызывающая никаких процессов, связанных с графическим интерфейсом, то все готово! В противном случае продолжайте читать:

Как запустить приложение с графическим интерфейсом, например Compton, из правила 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и %tзаменяются спецификаторами на $HOMEи /runили $XDG_RUNTIME_DIR. systemd.unit(5)Подробнее см.

ЛинияEnvironment="XAUTHORITY=/home/USERNAME/.Xauthority" обязательна, если вы хотите приложение с графическим интерфейсом. Пожалуйста, см.Этот ответ.

И наконец, в правиле udev вместо запуска приложения с графическим интерфейсом (в нашем случае Compton) запустите службу:

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

решение2

Существующий ответ заставил меня начать, но я решил поделиться окончательным результатом для себя - мой вариант использования заключался в том, чтобы что-то сделать (на самом деле выключить и включить умную розетку/реле из-за странной проблемы с блоком питания), когда ноутбук отключился от питания переменного тока.

Я споткнулся, потому что правила 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 отработал нормально.

Интересные ресурсы, которые можно использовать для улучшения вышеизложенного:

Связанный контент