Настройка будильника уже в systemd!
Опубликовано 28.10.2014 16:05 пользователем i.gnatenko.brain
Наш коллега Joey Hess из Debian открыл новый кейс использования systemd.
Я научил свой ноутбук просыпаться в 7:30 утра. Когда он просыпается - он запускает всё, что написано в моём
Это программируемый будильник, для работы которого не требуется чтобы ноутбук был включен всю ночь.
Но, он необязательно играет музыку и будит меня (я редко хочу просыпаться от будильника, просыпаться когда солнце светит в окно гораздо приятнее). Он может обрабатывать другие задачи, как загружать почту, прежде чем я проснусь. У меня дома стоит dial-up и процесс загрузки почты занимает час утром, так что было бы неплохо, чтобы почта загрузилась пока я сплю.
Это заняло некоторое время, чтобы выяснить как оно работает, но это оказалось удивительно просто. Кроме
После чего, вы так же должны отредактировать
Параметр
Кроме того, обратите внимание на параметр
Довольно много хороших кусков systemd работают вместе тут!
Намного проще запустить от суперпользователя и использовать su, чем настроить policykit.
Я научил свой ноутбук просыпаться в 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.