Настройка будильника уже в systemd!
Это архивная статья
Наш коллега Joey Hess из Debian открыл новый кейс использования
systemd.
Я научил свой ноутбук просыпаться в 7:30 утра. Когда он просыпается -
он запускает всё, что написано в моём
~/bin/goodmorning
скрипте. После чего, если крышка ноутбука продолжает быть закрыта - он
переключается обратно в спящий режим.
Это программируемый будильник, для работы которого не требуется чтобы
ноутбук был включен всю ночь.
Но, он необязательно играет музыку и будит меня (я редко хочу
просыпаться от будильника, просыпаться когда солнце светит в окно
гораздо приятнее). Он может обрабатывать другие задачи, как загружать
почту, прежде чем я проснусь. У меня дома стоит dial-up и процесс
загрузки почты занимает час утром, так что было бы неплохо, чтобы
почта загрузилась пока я сплю.
Это заняло некоторое время, чтобы выяснить как оно работает, но это
оказалось удивительно просто. Кроме
~/bin/goodmorning
, что может быть любой программой/скриптом, мне нужно всего 2 файла, чтобы systemd запускал это. ****
/etc/systemd/system/goodmorning.timer
[Unit] Description=good morning [Timer] Unit=goodmorning.service OnCalendar=*-*-* 7:30 WakeSystem=true Persistent=false [Install] WantedBy=multi-user.target
/etc/systemd/system/goodmorning.service
[Unit] Description=good morning RefuseManualStart=true RefuseManualStop=true ConditionACPower=true [Service] Type=oneshot ExecStart=/bin/systemd-inhibit --what=handle-lid-switch --why=goodmorning /bin/su joey -c /home/joey/bin/goodmorning
Установка:
После установки вышеуказаных файлов, запустите (с привелегиями суперпользователя):
systemctl enable goodmorning.timer; systemctl start goodmorning.timer
После чего, вы так же должны отредактировать
/etc/systemd/logind.conf
установив в нём
LidSwitchIgnoreInhibited=no
-- это позволит systemd-inhibit блокировать уход в спящий режим при закрытии крышки ноутбука. ****
Всё слишком просто
Я не думаю что сделать подобное в ближайшем будущем так легко без
systemd, logind, и т.д. Особенно организация пробуждения системы в
нужное время, манипуляция системой в зависимости от состояния статуса
крышки ноутбука .
Параметр
WakeSystem=true
опирается на какую-то аппаратную поддержку пробуждения из
сна. Мой
ноутбук поддерживает его без проблем, но я не знаю насколько много
ноутбуков его поддерживают.
Кроме того, обратите внимание на параметр
ConditionACPower=true
, который я добавил, как только понял, что я не хочу запускать скрипт,
если я забыл поставить ноутбук на зарядку на ночь. Технически, он всё
равно будет просыпаться при питании от аккумулятора, но должен
возвращаться обратно в сон.
Довольно много хороших кусков systemd работают вместе тут!
xfce workaround
При использовании xfce, xfce4-power-manager берёт управление системой при закрытии крышки на себя и сейчас запрещает системе возвращаться в сон если крышка ноутбука закрыта когда скрипт goodmorning завершается. К счастью, есть простой workaround; он настраивает xfce не переопределять поведение переключателя крышки.
xfconf-query -c xfce4-power-manager -n -p /xfce4-power-manager/logind-handle-lid-switch -t bool -s true
Другие окружения рабочего стола могут иметь подобные проблемы.
прочему не пользовательский юнит?
Было бы гороздо лучше использовать юниты systemd для пользователей,
вместо системных. Тогда я могу изменить время будильника без прав
суперпользователя.
Намного проще запустить от суперпользователя и использовать su, чем
настроить policykit.