Как запустить скрипт, когда блок питания подключен или отключен?

8

По какой-то причине яркость экрана моего ноутбука не обновляется при подключении или отключении питания. Я рассмотрел довольно много решений этой проблемы, но ни одно из них, похоже, не сработало. Поэтому вместо того, чтобы отчаиваться и сдаваться, я решил попытаться превратить это в опыт обучения и посмотреть, не смогу ли я написать сценарий, который сделает это за меня.

Я попытался выяснить это самостоятельно, с некоторой помощью из Интернета, конечно, но я довольно плохо знаком с bash-скриптингом и Ubuntu в целом, поэтому я не продвинулся далеко.

То, что я смог выяснить, было то, что я могу найти состояние батареи с

$ upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E "state"
state:     charging/discharging

в зависимости от того, подключен ли адаптер переменного тока. Я не знаю, полезно ли это, но это круто, и я не знал, как его использовать grepраньше, так что, черт возьми, обучение доставляет удовольствие.

В любом случае, есть ли какой-нибудь чистый способ сделать это? Под «чистым способом» я подразумеваю способ, которым может быть понят тот, кто имеет ограниченный опыт использования bash-скриптов.

Один похожий вопрос, на который я нашел хороший ответ, - это следующий вопрос:

Когда вы подключаете / отключаете адаптер переменного тока, сценарии /etc/pm/power.dвызываются с> аргументом: «true» (если вы работаете от батареи) или «false» (если вы работаете с адаптером питания>).

Проблема в том, что я не знаю, как получить доступ к этому аргументу из скрипта. Итак, я полагаю, что все сводится к довольно простой проблеме, но я решил в любом случае опубликовать вопрос, если у людей найдутся лучшие решения.

Джаспер
источник

Ответы:

5

Вы можете использовать on_ac_powerдля запуска сценария, когда источник питания включен или выключен.

Попробуйте следующее в терминале.

$ on_ac_power
$ echo $?
0              ## Laptop on ac power

$ on_ac_power
$ echo $?
1              ## Laptop on battery (not on ac power)

Исходя из этого, вы можете сделать свой сценарий как,

#!/bin/bash
while true
do
    if on_ac_power; then 
        do_something               ## Laptop on power
    else
        do_something_else          ## Laptop on battery
    fi
    sleep 10                       ## wait 10 sec before repeating
done

РЕДАКТИРОВАТЬ: [предложено KasiyA ]

cron job было бы лучше для запуска сценария через регулярные промежутки времени, чем использовать бесконечный цикл.

Сохраните ваш скрипт как myscript.shи поместите в него следующий контент:

#!/bin/bash
if on_ac_power; then 
    do_something
else
    do_something_else
fi

Сделайте скрипт исполняемым из терминала chmod +x /path/to/myscript.sh. Откройте свой личный crontabas EDITOR=gedit crontab -eи добавьте в него следующую строку, чтобы запускать ваш скрипт каждую минуту.

* * * * * /path/to/myscript.sh 
souravc
источник
Это плохая практика, когда скрипты работают бесконечно, или это то, что происходит регулярно и встроено в систему? Полагаю, я искал какой-то триггер, но если это сработает, то все гораздо сложнее, чем я предполагал.
Джаспер
@TheQZ: я думаю, что «souravc» дал основную идею ... вы можете написать свой собственный, основываясь на этом :)
heemayl
@TheQZ Хотя он работает вечно, но становится активным только один раз в 10 секунд (вы можете увеличить время проверки). Посмотрите на вопрос, как повторять команду-каждый-x-интервал времени . В противном случае вам нужно написать свою собственную программу-демон, которая очень сложна для начинающих.
souravc
@TheQZ Вы можете использовать ответ souravc как работу cron . см. вторую часть этого моего ответа
αғsнιη
2
Лучше использовать правило udev, как в askubuntu.com/questions/613741/… .
Энтони Вонг