[РЕШЕНО]Управление блокировками systemd-inhibit или сон во время выключения

Намедни решил раскопать проблему выключения своего ноута, а именно: при выключении, если не дождаться завершения сессии графического окружения (кеды), закрытие крышки ноутбука приводит ко сну, а не к выключению. Если далее открыть крышку и разбудить, то завершение работы продолжится как ни в чём ни бывало и комп выключится. Долгие и мучительные раскопки вопроса привели к тому, что тут шалит powerdevil кед; совсем отказываться от него не хочу, т.к. в остальном он меня устраивает (определение заряда батареи, переход в разные режимы и т.д.). Что интересно, на lxde такой ерунды не было, но там и нет менеджера питания: всё под контролем logind. Дальнейшее расследование показало, что logind не реагирует ни на что, несмотря на то, что я настроил, чтобы датчиком крышки ноутбука и кнопкой питания он управлял сам. Если в настройках powerdevil в кедах выставить на закрытие крышки «сон», то он, как и полагается засыпает, когда крышка закрывается, но появляется данная проблема (если закрыть крышку быстрее, чем успели завершиться кеды во время выключения); если же выставить в значение «ничего не делать», то он действительно ничего не делает, только экран при закрытии гаснет, но и logind'у не отдаёт управление, сволочь. Дальше я выяснил, что происходит это по причине т.н. systemd-inhibit, который запрещает обработку logind'ом каких бы то ни было событий питания; таким образом настраивать /etc/logind.conf бесполезно. Гугление на эту тему привело к весьма туманным результатам: описывается апи systemd-inhibit; то, что это всё дело управляется через dbus и т.д. В мане systemd-inhibit описано только как создавать энти самые запреты, а как ими управлять (удалять, временно блокировать и т.д.) ни слова. Теперь вопрос: кто что знает по этому поводу? Либо как «объяснить» powerdevil'у, что мне нужно, чтобы события от кнопок управлялись logind'ом, либо как исправить переход в сон во время завершения работы (повторюсь: выключается нормально, если закрыть крышку после того, когда кеды завершились и появилась консоль с журналом завершения работы)?

systemd-inhibit --list
     Who: NetworkManager (UID 0/root, PID 305/NetworkManager)
    What: sleep
     Why: NetworkManager needs to turn off networks
    Mode: delay

     Who: PowerDevil (UID 1000/bigboyuser, PID 552/org_kde_powerde)
    What: handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch
     Why: KDE handles power events
    Mode: block

     Who: Telepathy (UID 1000/bigboyuser, PID 464/mission-control)
    What: shutdown:sleep
     Why: Disconnecting IM accounts before suspend/shutdown...
    Mode: delay

3 inhibitors listed.
[email protected]# cat /dev/ass > /dev/head
Это читал Inhibitor Locks ?
Попробуй выключить с опцией ... i ... из командной строки, например, systemctl poweroff -i
Ошибки не исчезают с опытом - они просто умнеют
Если самому поставить block, например, на mc
$ systemd-inhibit --mode=block mc
$ systemd-inhibit --list
   What: shutdown:sleep:idle
   Why: Unknown reason
   Mode: block
То вижу, что lock на shutdown и просто выключить ноутбук не могу, пока не завершу mc
$ systemctl poweroff
Operation inhibited by "mc" (PID 737 "systemd-inhibit", user ...), reason is "Unknown reason".
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.
Нужно или завершить работу mc или выключить командой systemctl poweroff -i
У тебя же там наворочено много всего
What: handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch
И похоже все это прописывается при запуске powerdevil ...
И думаю, что можно попробовать только два простых варианта …. из сложных не знаю - я в кедах не разбираюсь
1. Перед выключением убивать powerdevil (можно через команду, повешанную на клавишу)
2. Выключать как уже писал с опцией i - systemctl poweroff -i
По другому снять lock не получится …..... или залазить в потроха и смотреть запуск этого powerdevil …. сам по себе же этот lock не врубается...
PS ….. Пришла еще одна идея — попробовать в /etc/systemd/logind.conf раскомментировать опцию LidSwitchIgnoreInhibited и изменить параметр yes на no (это позволит systemd-inhibit блокировать уход в спящий режим при закрытии крышки ноутбука).... но, возможно, что ноутбук при этом просто и не выключится ...но попробовать стоит (с перегрузкой)
Ошибки не исчезают с опытом - они просто умнеют
vasek, спасибо за ответы, но дело в том, что logind игнорирует нажатия кнопок и переключения дисплея, т.к. взведены ингибиторы (даже с настроенными опциями в /etc/logind.conf, как вы писали выше; кстати, они и так установлены в yes по умолчанию), поэтому я и задал вопрос как отключить ингибиторы, т.е. позволить управление logind'у, в то же время не отключая powerdevil, другими словами — можно ли их как-нибудь подружить? :-) естественно, в эмуляторе терминала
systemctl poweroff -i
работает корректно, более того, корректно работает и штатное выключение через меню и кнопку (если выставить в настройках powerdevil выключение, у меня пока настроено "ничего не делать", чтобы убедиться, что это он виноват, собственно об этом и тема) вопрос в другом, что позволяя управление powerdevil, он некорректно обрабатывает закрытие крышки во время выключения, и переводит ноут в ждущий режим. Если дождаться, пока завершатся кеды (а с ними и powerdevil, соответственно) и появится ядреная консоль с логами завершения, то после этого крышку можно смело закрывать, — система выключится как положено. Соответственно, logind обрабатывает данное событие корректно (закрытие крышки во время выключения), а powerdevil нет. Вот и хотелось бы отобрать у него управление кнопками и оставить всё остальное, а кнопуи доверить logind'у :-))) уф, многабукафф)) надеюсь, смог объяснить.
[email protected]# cat /dev/ass > /dev/head
В свое время немного гуглил об этих inhibitor (в чисто ознакомительном плане) … что за помнилось, так это наличие багов и иногда неуправляемости logind.conf — даже Поттеринг принимал участие в обсуждении (2-3 статьи с багами где то лежат в моей базе). И плюс к этому покапайся на BBS, там то же встречались топики на эту тему, в том числе упоминался и powerdevil.
И кажется мне, что это все-таки больше похоже на баг ...
Просьба - отписаться в случае решения проблемы или если нароешь что интересное....
PS … сейчас на BBS тупо, на скорую руку, вставил в строку поиска
What: handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch
и выскочило несколько топиков
Ошибки не исчезают с опытом - они просто умнеют
Да, баг; только вот, сдаётся мне, это таки баг powerdevil kde, т.к. это он не справляется с обработкой события закрытия во время выключения :-) logind как раз таки нормально обрабатывает данную ситуацию (см. первый пост про вариант lxde, там у меня питание полностью отдано на откуп systemd :-) Кстати, vasek, зная вашу любовь к статистике: в systemd, в целом за время, что я с ним знаком (около четырёх лет) мало сталкивался с багами, по крайней мере, как админ холокоста локалхоста, а вот с багами различных прикладных приложений — регулярно. Я полагаю всё же системный код в линуксе пишут довольно качественно. А сколько срачей читал про системд, — в основном его хают за его концепцию, но я считаю это делом привычки (т.к. с инитом я успел столкнуться очень мало) и нежеланием переучиваться (уж так устроен наш мозг, что в 90℅ случаев нам просто лень учиться и принимать новое), а так некоторые люди отмечают его код технически правильным и хорошо документированным. Из чего я сделал для себя вывод, что все проблемы банально от непонимания сути ( в мире вообще много проблем от этой простой вещи ). Один из примеров: https://bbs.archlinux.org/viewtopic.php?id=204346. P.s.: это лишь моё скромное мнение, и, т.к. тема про системд холиварная, я на этом закончу :-)
---
По теме: вообще говоря, я немного неверно передал суть проблемы в названии. То, что моя проблема — баг powerdevil kde, это я знал изначально, но, т.к. исходники я читать не сильно умею, и учётной записью на девелоперском сайте кед не обладаю, код кде очень изменчивый, мне тупо пока лень с ними разбираться (да-да, лень матушка), а из-за короткого срока жизни кода вообще мало желания. Поэтому мне проще подпереть костылями посредством systemd-inhibitors: т.е. убрать запрет на управление питанием logind'у. В выводе команды это второй сервис, как следует из названия:
Who: PowerDevil (UID 1000/bigboyuser, PID 552/org_kde_powerde)
    What: handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch
     Why: KDE handles power events
    Mode: block
Вот это мне нужно как-то выловить и удалить запрет. В этом суть моего вопроса. Как работают ингибиторы, я полагаю, разобрался, но исходя из манов, их можно только создать, а как удалить нигде не написано! Как я понял блокировки реализуются посредством DBus API [²]. С Dbus я пока особо не разбирался, но, видимо, там и зарыта собака. Может как-то оттуда нужно удалять эти строки; где прописаны эти конфиги, — с этим мне и предстоит разбираться. Уж не знаю что легче: разобраться с логикой powerdevil и исправить её, или разобраться с dbus :-) Скорее всего пойду по второму пути, т.к. DBus уже много где используется и нужно с ним разобраться.

Источники:
[1] [2] [3]
[email protected]# cat /dev/ass > /dev/head
Приехал домой, попробовал ваш совет отредактировать /etc/systemd/logind.conf и раскомментировал LidSwitchIgnoreInhibited, но оставил параметр yes, также изменил параметр PowerKeyIgnoreInhibited на yes, всё заработало, настройки powerdevil'а в отношении питания игнорируются, проверил ждущий режим и гибернацию, а также скрипт отложенной гибернации, всё работает. Спасибо за советы, тема закрыта!
P.S.: ещё мой косяк был в том, что я предположил, что значения в закомментированных строчках /etc/systemd/logind.conf являются значениями по умолчанию и поэтому по-настоящему выставил эти значения только сегодня, приехав домой, после этого всё встало на свои места.
[email protected]# cat /dev/ass > /dev/head
Sheykhnur
ещё мой косяк был в том, что я предположил, что значения в закомментированных строчках /etc/systemd/logind.conf являются значениями по умолчанию
это не косяк, ты все правильно предположил!!!
https://www.freedesktop.org/software/systemd/man/logind.conf.html
LidSwitchIgnoreInhibited= defaults to "yes".
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
 
Зарегистрироваться или войдите чтобы оставить сообщение.