Как запустить скрипт, когда крышка закрыта?

Я пытаюсь настроить свой ноутбук с LUbuntu 18.04, чтобы сначала перейти на экран входа в систему, а затем , а затем после отображения экрана входа в систему, приостановить работу. Причина этого заключается в том, что по умолчанию простой приостановки и последующего отображения экрана входа в систему при возобновлении приводит к задержке около 5 секунд, прежде чем экран входа в систему отображается после возобновления, тогда как, если экран входа в систему уже активирован, когда машина приостановлена, оно доступно почти сразу после возобновления.

В любом случае, я изучал, как это сделать, и мне кажется, что мой лучший вариант - просто запустить скрипт при закрытой крышке, который сначала вызывает dm-tool lock с последующей задержкой, если необходимо дождаться появится экран входа в систему, а затем systemctl suspend.

Однако, как связать действие закрывающейся крышки с запуском этого скрипта? Из моего исследования стало ясно , что acpid - это путь. Из прочтения справочной страницы выясняется, что в /etc/acpi/events должен быть исполняемый скрипт с именем lidbtn. Каталог существует в моей системе, но такого сценария не существует, и страница руководства неясно, что именно он должен содержать. Глядя на другие скрипты в этом каталоге, выясняется, что мне нужно знать, что поместить в строку «event =», но я нигде не нашел этого.

Также упоминается о том, что оконный менеджер обрабатывает это событие, и неясно, что мне нужно сделать, чтобы мой сценарий не конфликтовал с этим. В Xfce Power Manager (Меню -> Настройки -> Power Manager) на вкладке Общие я вижу «Когда крышка ноутбука закрыта» ... Приостановить, но единственными другими вариантами являются «Отключить дисплей» и «Экран блокировки». Нет выбора для "ничего не делать". Что мне нужно сделать здесь? Происходит ли запрошенное действие до или после выполнения сценария acpid, который я могу создать, или это полностью отменяет это?

1
задан 3 May 2019 в 22:15

1 ответ

Сначала я создал новый файл /etc/acpi/events/laptop-lid, содержащий следующее:

event=button/lid.*
action=/etc/acpi/laptop-lid.sh

Затем я создал /etc/acpi/laptop-lid.sh, содержащий этот код:

#!/bin/bash

source /home/michael/.Xdbus
grep -q closed /proc/acpi/button/lid/LID/state
if [ $? = 0 ]
then
    # close action
    dm-tool switch-to-greeter
    sleep 5
    systemctl suspend
else
    # open action
fi

В /home/michael/.Xdbus I поставить следующее:

export XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0

И я сделал /etc/acpi/laptop-lid.sh исполняемым (chmod a+x).

Затем я запустил /etc/init.d/acpid restart

Наконец, я вошел в XFCE Power Manager и установил его на «Выключить дисплей», когда крышка ноутбука закрыта, чтобы избежать конфликта с моей новой улучшенной функциональностью. .

Однако я обнаружил, что проблема все еще остается - после выхода из режима ожидания отображается экран входа в систему, а затем машина снова приостанавливается. После небольшого поиска я думаю, что это связано с ошибкой в Ubuntu, которая, по-видимому, все еще существует в 18.04. Я обошел его, проверив, прошло ли более 6 секунд с тех пор, как я пытался заснуть 5 секунд, и если это так, я не приостанавливаю. Кажется, что мой ноутбук на самом деле зависает менее чем за 2 секунды, так что это всегда работает для меня. Я попытался настроить Xfce для блокировки экрана, но, похоже, это тоже не учитывалось - в обоих случаях моя машина была приостановлена ​​менее чем за 2 секунды, в то время как мой сценарий заставлял ее ждать как минимум 5.

Обновление:

После всего этого я все еще был полностью неудовлетворен. Поскольку мои настройки XFCE Power Manager в основном игнорируются, приводя машину в всегда в сон, когда я закрываю крышку, это создает состояние гонки между процессом сна и тем, как далеко дм-инструмент идет к созданию приветствия, что всегда приводит к некоторой задержке при возобновлении, пока этот процесс завершает вызов приветствия. Поэтому я полностью отменил все вышеперечисленные работы и вместо этого сделал следующее:

Редактировать ~/.config/openbox/lubuntu-rc.xml. Найдите привязку клавиш, чтобы заблокировать экран, и измените ее, чтобы переключиться на приветствующего. Основным эффектом этого, по-видимому, является , а не отключение дисплея, что, по-видимому, важно для того, чтобы приветствующий мгновенно появлялся при возобновлении:

    <keybind key='W-L'>
        <action name='Execute'>
            <command>dm-tool switch-to-greeter</command>
        </action>
    </keybind>

Теперь вместо того, чтобы закрывать крышку, Я нажимаю Win + L, и как только появляется приветствующий, я затем закрываю крышку.

Примечание: я хотел, чтобы имел отдельный скрипт, который сначала переключается на приветствующего, затем приостанавливается, но, похоже, неважно, как я пытаюсь приостановить (systemctl, dbus и т. Д.) Их ] все отказываются отстраняться от экрана блокировки без ручного вмешательства - ввода пароля из диалогового окна - это невозможно удовлетворить, потому что мы находимся на экране блокировки!

0
ответ дан 3 May 2019 в 22:15

Другие вопросы по тегам:

Похожие вопросы: