Нет, так как ядро не предоставляет какой-либо сигнал "засыпания" до замораживания всех процессов, нет никакого независимого от распределения способа его обнаружения.
Тем не менее, почти все запросы приостановки - включая закрытие крышки - имеют тенденцию проходить через несколько пользовательских интерфейсов 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 там ...)
В целом, в этой ситуации методы, специфичные для среды рабочего стола, могут работать лучше.