Чтобы сэкономить заряд батареи, я бы хотел отключать эффекты (композитор) всякий раз, когда ноутбук работает от батареи. Я думал сделать это с помощью правил 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:
Создайте правило udev, которое будет выполнять скрипт для завершения работы вашего приложения (compton) при отключении питания.
Запустить его снова не так-то просто — создайте службу systemd для запуска вашего приложения, а затем используйте правило udev для запуска этой службы.
Чтобы проверить ваши правила udev, используйте
udevadm control --reload-rules && udevadm trigger
Отвечать:
Итак, я нашел работающее решение. Вопрос состоял из 2 вопросов, поэтому давайте разберем его:
- Напишите правило udev для запуска при подключении/отключении питания/аккумулятора.
- Как запустить графическое приложение, например 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 отработал нормально.
Интересные ресурсы, которые можно использовать для улучшения вышеизложенного: