Моя кнопка питания не работает под LXDE. Как я могу это исправить?

С тех пор, как я переключился на LXDE, моя кнопка питания больше не будет работать. Я хотел бы иметь возможность отображать необычное меню выхода из системы, такое как в Unity и подобных DE. Как мне этого добиться?

3
задан 18 August 2013 в 20:50

3 ответа

Путь ACPID


Обзор

Существуют многочисленные способы устранить эту проблему. При просмотре сети, Вы найдете предложения при установке диспетчеров электропитания используемыми в других настольных средах (DES) как xfce4-power-manager или gnome-settings-daemon. Однако как пользователь LXDE Вы, вероятно, боретесь за легкое решение. Один легкий способ отобразить меню выхода из системы на нажатии кнопки питания состоит в том, чтобы использовать сценарий ACPID.

Что такое ACPID?

От ArchWiki:

acpid является гибким и расширяемым демоном для поставки событий ACPI. Это слушает на/proc/acpi/event и когда событие имеет место, выполняет программы для обработки события. Эти события инициированы определенными действиями, такими как:

  • Нажатие специальных клавиш, включая кнопку Power/Sleep/Suspend

  • Закрытие крышки ноутбука (ООН), Включающая адаптер питания переменного тока от ноутбука

  • (ООН), Включающая телефонный разъем и т.д.

Установка

sudo apt-get install acpi acpid

Конфигурация

Открытый /etc/acpi/powerbtn.sh в текстовом редакторе по Вашему выбору, например, leafpad:

gksudo leafpad /etc/acpi/powerbtn.sh

В конце файла Вы найдете следующий отрывок:

# If all else failed, just initiate a plain shutdown.
/sbin/shutdown -h now "Power button pressed"

Незадолго до этого прохода добавляют следующий отрывок:

# If LXDE is running execute lxsession-logout
if [ -n $(pidof lxsession) ]; then
    for x in /tmp/.X11-unix/*; do
       displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
       getXuser;
       if [ x"$XAUTHORITY" != x"" ]; then
           export DISPLAY=":$displaynum"
           export _LXSESSION_PID=`pidof lxsession`
           lxsession-logout
           exit
       fi
    done
fi

Большая часть отрывка состоит из функций и команд, которые удостоверяются, что графическое приложение как меню выхода из системы может быть запущено ACPID (устанавливающий переменные среды как XUSER и DISPLAY).

Примечание: Если у Вас есть компоненты GNOME, работающие на Вашей сессии LXDE (например, наутилус, различные демоны), обнаружение сессии могло бы пойти не так, как надо. В этих случаях я советовал бы Вам вводить код следующим образом:

  if pidof x $PMS > /dev/null; then
     if [ -n $(pidof lxsession) ]; then
        for x in /tmp/.X11-unix/*; do
           displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
           getXuser;
           if [ x"$XAUTHORITY" != x"" ]; then
           export DISPLAY=":$displaynum"
           export _LXSESSION_PID=`pidof lxsession`
           killall lxsession-logout
           lxsession-logout
           fi
        done
        echo "if correct"
        exit
             else
                 exit
     fi
<...>

Поиск и устранение неисправностей

По некоторой неизвестной причине не всегда работают эти функции. В этом случае необходимо будет заменить отрывок выше следующим:

if [ -n $(pidof lxsession) ]; then
   export DISPLAY=:0
   export _LXSESSION_PID=$(pidof lxsession)
   export XUSER=user
   export XAUTHORITY=/home/user/.Xauthority
   lxsession-logout
   exit
fi

Переменные среды трудно кодируются в этом. Удостоверьтесь, что заняли место user для Вашего собственного имени пользователя. Это должно работать на большинство однопользовательских конфигураций системы.

Вот другое обходное решение, на всякий случай ни один из вариантов выше работы. Замените getXuser функция со следующим отрывком:

getXuser() {
        user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
        if [ x"$user" = x"" ]; then
                startx=`pgrep -n startx`
                if [ x"$startx" != x"" ]; then
                        user=`ps -o user --no-headers $startx`
                fi
        fi
        if [ x"$user" = x"" ]; then                           # lines added
               user=$(pinky -fw | awk '{ print $1; exit; }')  # lines added
        fi                                                    # lines added
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
        export XUSER=$user
}

Что это делает?

powerbtn.sh сценарий инициирован ACPID каждый раз, когда кнопка питания нажимается. Поскольку Вы видите, что это уже включает много проверок на общий DES как Единица, GNOME и KDE. Эти проверки там, чтобы удостовериться, что событие завершения работы обрабатывается соответствующим диспетчером электропитания. Увы, LXDE не встроили одного из тех.

Вот почему мы добавили собственный отрывок, который делает проверку ACPID. Если это обнаруживает сессию LXDE, это удостоверяется, что Ваш ПК только закрывается сразу же и вместо этого запускает меню выхода из системы, с которым необходимо быть знакомы.

С этими изменениями необходимо теперь смочь запустить меню выхода из системы с аппаратной кнопкой питания - не будучи должен установить большого диспетчера электропитания. И еще лучше, это не вмешивается в другой DES всегда.

Источники

http://www.ollie-reardon.co.uk/lxde-tip-power-button-not-working/

https://wiki.archlinux.org/index.php/Acpid

http://forum.lxde.org/viewtopic.php?f=8&t=205


Дальнейшее чтение

Lubuntu - кнопка питания не выключает компьютер,

Кнопка питания ноутбука, не работающая

https://bugs.launchpad.net/xfce4-power-manager / + ошибка/1008650

https://unix.stackexchange.com/questions/87259/why-wont-this-shutdown-script-work-when-executed-by-acpid

4
ответ дан 18 August 2013 в 20:50

Похоже, что LXDE не включает пакет lxsession-logout. Установите пакет, введя его в терминале:

sudo apt install lxsession-logout

Я знаю, что это старая ветка, но я только что столкнулся с этой проблемой и нигде не смог найти прямой ответ.

0
ответ дан 18 August 2013 в 20:50

Использование systemd. Просто отредактируйте /etc/systemd/logind.conf , раскомментируйте соответствующую строку для HandlePowerKey и установите значение poweroff , suspend или спящий режим по желанию. Есть и другие настройки для переключателя крышки и т. Д.

Дополнительная информация, параметры


Без systemd. Это может получить бесполезные очки стиля за использование w , pidof , read и ps вместо передачи через sed .

В /etc/acpi/powerbtn.sh , перед заключительной проверкой и разделом выключения.

# If LXDE is running execute lxsession-logout
IFS=" "
read -r user pid foo <<<$(ps u --no-headers -C lxsession)
if [ x"$user" != x"" ]; then
   read -r foo display foo <<<$(w -sh $user)
   if [ x"$XAUTHORITY" != x"" ]; then
       export DISPLAY="$display"
       export _LXSESSION_PID=$pid
       lxsession-logout
       exit
    fi
fi

Устранение неполадок.

Для устранения неполадок сохраните этот фрагмент как сценарий и (при условии, что вы понимаете команды, а не просто выполняете код вслепую из Интернета) вызовите его как root.

0
ответ дан 2 February 2020 в 03:14

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

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