Настройка будильника уже в 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.