Нет, так как ядро не предоставляет какой-либо сигнал "засыпания" до замораживания всех процессов, нет никакого независимого от распределения способа его обнаружения.
Тем не менее, почти все запросы приостановки - включая закрытие крышки - имеют тенденцию проходить через несколько пользовательских интерфейсов API: в конечном итоге они либо вызывают функцию Suspend()
systemd-logind через D-Bus, либо порождают команду pm-suspend
. Оба имеют различные виды "крючков", которые можно использовать для этого.
(Обратите внимание, что независимо от того, что вы делаете, прямое echo mem > /sys/power/state
остается практически невидимым для пространства пользователя, если не считать внезапных скачков часов ...)
Итак, если вы используете systemd в качестве init:
Установите xss-lock
и сделайте так, чтобы среда рабочего стола запускала его при входе в систему (через ~/.xinitrc
, через ~/.config/autostart/
или через что угодно):
xss-lock xlock &
Это будет обрабатывать предварительные уведомления systemd, а также ручные loginctl lock-sessions
если они вам понадобятся.
Создайте скрипт подключения pm-utils в /etc/pm/sleep.d/50lock
:
#!/bin/sh loginctl lock-сессии
(Не забудьте chmod +x
.) Это не нужно для обычного приостановления systemd, но оно будет отправлять уведомление в xss-lock всякий раз, когда вы вручную запускаете pm-suspend
.
Если вы используете другую систему инициализации:
Если вы используете pm-suspend
, я полагаю, вы можете запустить xlock
непосредственно из скрипта ловушки pm/sleep.d. Это потребовало бы, чтобы вы также непосредственно устанавливали переменные окружения DISPLAY
и XAUTHORITY
, что довольно ужасно, так как они могут варьироваться от загрузки к загрузке (хотя некоторые люди используют жесткий код :0
там ...)
В целом, в этой ситуации методы, специфичные для среды рабочего стола, могут работать лучше.