С тех пор, как я переключился на LXDE, моя кнопка питания больше не будет работать. Я хотел бы иметь возможность отображать необычное меню выхода из системы, такое как в Unity и подобных DE. Как мне этого добиться?
Обзор
Существуют многочисленные способы устранить эту проблему. При просмотре сети, Вы найдете предложения при установке диспетчеров электропитания используемыми в других настольных средах (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
Похоже, что LXDE не включает пакет lxsession-logout. Установите пакет, введя его в терминале:
sudo apt install lxsession-logout
Я знаю, что это старая ветка, но я только что столкнулся с этой проблемой и нигде не смог найти прямой ответ.
Использование 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.