Вопрос или проблема
Это действительно раздражает, так как мне приходится отключать мышь после сна, чтобы случайный толчок не разбудил систему. Я не нашел ничего в настройках системы, что могло бы это отключить, даже при поиске в Google.
Я еще не проверил BIOS, но нашел решение!
Краткое резюме: в /proc/acpi/wakeup
вы можете увидеть, какие устройства в настоящее время включены для пробуждения после сна. Этот список показывает имена (сокращенные) так называемых “Устройств”. Пример “PWRB” означает “кнопка питания”.
Если вы запишете имена устройств в этот файл, вы переключаете их между включенным/выключенным состоянием.
Я написал небольшое руководство по отключению пробуждения от мыши, основанное на блоге, где я нашел эту информацию.
Спасибо всем участникам, так как пробуждение от мыши – это большая неудобство, и я нашел свои ответы здесь. Я хочу добавить свой вклад в решения, так как это может помочь в большем количестве случаев. Мне пришлось отключить 3 разных элемента в /proc/acpi/wakeup
. Мои устройства: EHC1, EHC2, XHCI
. Первые 2 – это usb2, а 3-й – usb3. Обратите внимание, что хотя usb-передатчик для моей мыши подключен к порту usb2, а в любом порту usb3 ничего нет, компьютер будет просыпаться при движениях мыши, пока все 3 элемента не будут отключены.
$ cat /proc/acpi/wakeup | sort
Устройство S-состояние Статус Sysfs узел
EHC1 S3 *disabled pci:0000:00:1d.0
EHC2 S3 *disabled pci:0000:00:1a.0
GLAN S4 *enabled pci:0000:08:00.0
.. ,, ..
USB7 S3 *disabled
WLAN S3 *disabled pci:0000:03:00.0
XHCI S3 *disabled pci:0000:07:00.0
Чтобы отключить элементы пробуждения при каждом запуске, вы можете добавить что-то подобное в /etc/rc.local
..
echo EHC1 > /proc/acpi/wakeup
echo EHC2 > /proc/acpi/wakeup
echo XHCI > /proc/acpi/wakeup
Проверьте, какие элементы необходимо отключить – как указано здесь – для каждого элемента, который был опубликован как включен
в cat /proc/acpi/wakeup | sort
, запустив в терминале каждую из команд ниже и затем проверив, пробуждает ли мышь систему (без необходимости перезагрузки):
sudo sh -c "echo EHC1 > /proc/acpi/wakeup"
sudo sh -c "echo EHC2 > /proc/acpi/wakeup"
sudo sh -c "echo XHCI > /proc/acpi/wakeup"
(в моем случае первого было достаточно, даже после тестирования с другими USB-портами)
Если файл /etc/rc.local
не существует
Согласно этому посту, выполните:
printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
Файл должен выглядеть примерно так:
#!/bin/bash
echo EHC1 > /proc/acpi/wakeup
echo EHC2 > /proc/acpi/wakeup
echo XHCI > /proc/acpi/wakeup
exit 0
Перезагрузите.
Если это все еще не работает, возможно, файл /etc/systemd/system/rc-local.service
отсутствует или неправильно настроен.
Проверьте с помощью
sudo /etc/init.d/rc.local start
и
sudo systemctl status rc-local
Следуя инструкциям по включению /etc/rc.local с помощью Systemd:
Создайте файл:
sudo nano /etc/systemd/system/rc-local.service
Затем добавьте следующее содержимое в него.
[Unit]
Description=/etc/rc.local Совместимость
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
Сохраните и закройте файл. Чтобы сохранить файл в текстовом редакторе Nano, нажмите Ctrl+O, затем нажмите Enter, чтобы подтвердить. Чтобы выйти из файла, нажмите Ctrl+X.
Проверьте, все ли в порядке, без ошибок с помощью:
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
Перезагрузите, чтобы увидеть изменения.
Решение, которое я использую, – это правило udev, которое отключает пробуждение от конкретного USB-устройства. Оно должно быть независимым от того, в какой порт подключено устройство.
Создайте /etc/udev/rules.d/90-usb-wakeup.rules
со следующим содержимым (измените idVendor
и idProduct
по необходимости, смотрите вывод lsusb
, который дает идентификаторы в виде: vendor:product
):
# Отключить пробуждение от универсального приемника Logitech
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", ATTR{power/wakeup}="disabled"
Чтобы применить это без перезагрузки:
-
Выполните:
sudo udevadm control --reload-rules
-
Отключите и подключите USB-устройство заново.
Вдохновение приходит из https://wiki.archlinux.org/title/udev#Waking_from_suspend_with_USB_device
Это решение работает в Ubuntu 15.10, 18.04, 20.04, 22.04
Найдите idProduct и idVendor вашей мыши, отключив и снова подключив мышь и просматривая папки /sys/bus/usb/devices/*
. Игнорируйте ссылки с :
в имени. Например, следуйте ссылке для 3-3
, но игнорируйте 3-3:1.0
Теперь попробуйте прочитать idProduct и idVendor. Например:
cat /sys/bus/usb/devices/7-2.3/idProduct
=> 2000
,
cat /sys/bus/usb/devices/7-2.3/idVendor
=> 24ae
.
Наконец, я создаю скрипт в директории /lib/systemd/system-sleep
, называю его mouse-suspend.sh
#!/bin/bash
# Из lsusb: Bus 007 Device 008: ID 24ae:2000
idProduct=2000
idVendor=24ae
# Получить путь к устройству по idVendor и idProduct
function find_device()
{
local vendor=$1
local product=$2
vendor_files=( $(egrep --files-with-matches "$vendor" /sys/bus/usb/devices/*/idVendor) )
for file in "${vendor_files[@]}"; do
local dir=$(dirname "$file")
if grep -q -P "$product" "$dir/idProduct"; then
printf "%s\n" "$dir"
return
fi
done
}
sysdev=$(find_device $idVendor $idProduct)
if [ ! -r "$sysdev/power/wakeup" ]; then
echo $idVendor:$idProduct не найден 1>&2
exit 1
fi
case "$1" in
enabled|disabled)
echo $1 > "$sysdev/power/wakeup"
;;
*)
echo "$0 enabled -- чтобы включить пробуждение для этого устройства"
echo "$0 disabled -- чтобы отключить пробуждение для этого устройства"
;;
esac
grep --color=auto -H ".*" "$sysdev/power/wakeup"
exit 0
Если это не работает, запустите sudo chmod +x mouse-suspend.sh && ./mouse-suspend.sh enabled
Вышеуказанное решение (https://askubuntu.com/a/265389/1467620) работает, но оно грубое и также отключает пробуждение от клавиатуры, что на самом деле полезно.
Более детальный альтернативой может быть следующее:
Сначала мы начинаем с перечисления USB-устройств, подключенных к системе:
lsusb | sort
Отсюда довольно очевидно, какая из них мышь:
Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
Затем мы продолжаем находить, куда устройства сопоставлены:
grep enabled /sys/bus/usb/devices/*/power/wakeup
/sys/bus/usb/devices/2-1.2.6/power/wakeup:enabled
/sys/bus/usb/devices/2-1.2.7/power/wakeup:enabled
Наконец, чтобы выяснить, какое из них какое, мы используем:
dmesg | grep Logitech | grep -o -P "usb.+?\s"
usb 2-1.2.7:
На этом этапе довольно очевидно, какое нужно отключить:
sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/2-1.2.7/power/wakeup"
Примечание: Каждый раз, когда вам нужно выполнить echo от имени суперпользователя, sh -c
необходим, или система не позволит перенаправить в привилегированный файл.
Затем просто дело в том, чтобы приостановить систему и проверить, что, хотя мышь её не пробуждает, клавиатура будет.
Это не сохраняется после перезагрузки системы, поэтому либо вам нужно снова выполнить последнюю команду, либо добавить её в ваш .bashrc
или .zshrc
.
Это то, что беспокоит меня в Ubuntu с тех пор, как я установил 16.04, и вероятно, будет беспокоить навсегда. Я не понимаю, почему Canonical не добавит это в настройки системы.
Источник: https://codetrips.com/2020/03/18/ubuntu-disable-mouse-wake-from-suspend/
Смешно, но метод отключения, подключения обратно, чтобы определить код устройства, является наименее утомительным. Итак:
- найти
grep . /sys/bus/usb/devices/*/power/wakeup | grep enabled
Узнайте виновника, используя метод отключения-подключения
- отключить
sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/YOUR_DEVICE/power/wakeup"
Вдохновленный этим постом в блоге
Решение, которое сработало для меня, было получено здесь.
Сначала мы начинаем с перечисления USB-устройств, подключенных к системе:
lsusb | sort
Отсюда довольно очевидно, какая из них мышь:
Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
Затем мы продолжаем находить, куда устройства сопоставлены:
grep enabled /sys/bus/usb/devices/*/power/wakeup
/sys/bus/usb/devices/2-1.2.6/power/wakeup:enabled
/sys/bus/usb/devices/2-1.2.7/power/wakeup:enabled
Наконец, чтобы выяснить, какое из них какое, мы используем:
dmesg | grep Logitech | grep -o -P "usb.+?\s"
usb 2-1.2.7:
На этом этапе довольно очевидно, какое нужно отключить:
sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/2-1.2.7/power/wakeup"
(Примечание: каждый раз, когда вам нужно выполнить echo от имени суперпользователя, sh -c необходим, или система не позволит перенаправить в привилегированный файл).
Затем просто дело в том, чтобы приостановить систему и проверить, что, хотя мышь её не пробуждает, клавиатура будет.
Это не сохраняется после перезагрузки системы, поэтому либо вам нужно снова выполнить последнюю команду, либо добавить её в ваш .bashrc или .zshrc
Запустить команду после перезагрузки
Запустите команду sudo crontab -e
затем в новой строке добавьте @reboot
и команду, которую вы хотите запустить после перезагрузки. Например:
@reboot sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/3-3/power/wakeup"
Сохраните файл и попробуйте перезапустить компьютер. Не добавляйте эту команду в ваш .bashrc, это может помешать вашему компьютеру загрузиться.
Это мой пошаговый “урок”, чтобы заставить это работать для вас:
- Используйте команду
cat /proc/acpi/wakeup
, чтобы показать список устройств пробуждения - Используйте команду
sudo sh -c "echo XXXX >/proc/acpi/wakeup"
(замените “XXXX” на код вашего устройства), чтобы переключить состояние устройства (включено/выключено). Проходите по одному устройству и пытайтесь приостановить машину и разбудить её с помощью устройства, которое вы хотите отключить, пока нужное устройство не сможет разбудить машину. Не забудьте всегда снова включить устройства, которые вы не хотите отключать. - Когда вы найдете нужное устройство, создайте на вашем рабочем столе файл “acpi_wakeup”, содержащий следующий код:
#!/bin/sh
printf "XXXX" > /proc/acpi/wakeup
(не забудьте заменить “XXXX” на код вашего устройства) - Переместите или скопируйте файл в папку
/etc/init.d/
.
Чтобы скопировать файл, используйте следующую команду:
sudo cp /home/USERNAME/Desktop/acpi_wakeup /etc/init.d/acpi_wakeup
(замените “USERNAME” на ваше фактическое имя пользователя) - Сделайте файл исполняемым:
sudo chmod 755 /etc/init.d/acpi_wakeup
- Затем используйте ‘update-rc.d’, чтобы автоматически создать необходимые символические ссылки в других директориях:
sudo update-rc.d acpi_wakeup defaults
(это покажетWARNING: ...missing LSB tags and overrides
, но это нормально. Не беспокойтесь об этом) - Перезагрузите компьютер.
Источники и дальнейшее чтение:
http://www.das-werkstatt.com/forum/werkstatt/viewtopic.php?f=7&t=1985
http://ubuntuforums.org/showthread.php?t=814939&page=3
В Kubuntu 19.10 настройка /etc/rc.local
перестала работать для меня. Я впервые заметил это на Manjaro KDE и нашел это решение, которое сработало там. Оно также работает в Kubuntu 19.10, что может означать, что в новых системах произошли некоторые изменения (относятся ли они к ядру или версии Plasma, я не знаю).
Итак:
sort /proc/acpi/wakeup
и смотрите элементы, которые отмечены как “включены”. Обратите внимание на их имена (например, EHC1, EHC2, NXUC). Затем проверьте, какие из команд, подобных этим, прекращают пробуждение ПК от мыши:
sudo sh -c "echo EHC1 > /proc/acpi/wakeup"
sudo sh -c "echo EHC2 > /proc/acpi/wakeup"
sudo sh -c "echo NXUC > /proc/acpi/wakeup"
Создайте папку ~/.bin
mkdir ~/.bin
(Если вы предпочитаете другое расположение, замените его соответственно в следующих файлах.)
Создайте службу systemd. В терминале:
nano /etc/systemd/system/wakeup-events.service
С таким содержанием:
[Unit]
Description=Отключить события пробуждения при загрузке
[Service]
Type=oneshot
ExecStart=/bin/bash ~/.bin/wakeup-events.sh
[Install]
WantedBy=multi-user.target
Сохраните и введите пароль.
В терминале:
nano ~/.bin/wakeup-events.sh
с следующим содержанием:
#!/bin/bash
# Отключить события пробуждения
echo EHC1 > /proc/acpi/wakeup
echo EHC2 > /proc/acpi/wakeup
echo NXUC > /proc/acpi/wakeup
(Замените соответственно: например, EHC1, EHC2, NXUC).
Не забудьте:
sudo systemctl enable wakeup-events
И перезагрузите
.
Вот более простое решение. Я просто добавил первую строку:
sudo sh -c "echo disabled > /sys/bus/usb/devices/1-1/power/wakeup"
Теперь USB-устройство 1 не пробуждает компьютер.
Примечание: при перезагрузке системы эта процедура сбросится и её нужно будет выполнить снова.
Возможно, существует способ, специфичный для вашего оборудования, в этом случае опция может быть доступна через настройки BIOS вашей системы.
Чтобы попасть в меню BIOS для изменения настроек, это также зависит от системы. Обычно вам нужно нажать клавишу сразу после перезагрузки, и клавиша, которую нужно нажимать, часто отображается на экране.
Тем не менее, ответ пользователя138339 кажется более общим способом достичь того, что вам нужно, и вы можете сделать это из работающей системы.
Отличное объяснение. Я просто добавил в rc.local следующую команду
for d in $(cat /proc/apci/wakeup | grep enabled | grep -v PS2K | cut -b -4); do echo $d > /proc/acpi/wakeup ; done
чтобы отключить каждое устройство, кроме PS2K (клавиатура PS2) от пробуждения.
Этот скрипт решил мою проблему. Ознакомьтесь с ним.
#!/bin/bash
# разрешить только один экземпляр
r=$(pidof -x -o $$ ssmonoff.sh)
set -- $r
if [ "${#@}" -ge 1 ]; then
echo "Скрипт уже запущен. Выход..."
exit
fi
dbus-monitor --session "type="signal",interface="org.gnome.ScreenSaver"" | ( while read line; do
if echo $line | grep "boolean true" &> /dev/null; then
xinput --set-prop "Dell Premium USB Optical Mouse" "Device Enabled" "0"
xset dpms force off
else
xinput --set-prop "Dell Premium USB Optical Mouse" "Device Enabled" "1"
fi
done )
Всё, что вам нужно сделать, это сначала запустить sudo xinput list
,
найти данное имя вашей USB-мишки и вставить его в скрипт.
Затем сохраните файл как “ssmonoff.sh”, сделайте его исполняемым и настройте его на запуск при старте.
Чтобы отключить все USB-устройства от пробуждения вашего компьютера:
Создайте правило udev sudo vim /etc/udev/rules.d/99-usb-wakeup.rules
ACTION==”add”, SUBSYSTEM==”usb”, RUN+=”/bin/sh -c ‘echo disabled >
/sys/bus/usb/devices/%k/power/wakeup'”
sudo udevadm control --reload-rules
Ответ или решение
Чтобы предотвратить случайное пробуждение компьютера из режима сна при движении мыши, необходимо выполнить несколько шагов. Данная проблема часто возникает на системах Linux, и существует несколько решений, позволяющих отключить функцию пробуждения от движений USB-устройств, таких как мыши.
Шаг 1: Определение активных устройств пробуждения
Сначала следует получить список всех устройств, которые могут разбудить ваш компьютер:
cat /proc/acpi/wakeup
Вывод этой команды покажет вам список устройств и их состояние (включено или отключено). Вам нужно обратить внимание на те устройства, которые помечены как "enabled".
Шаг 2: Отключение пробуждения для мыши
После того как вы нашли нужные устройства, вы можете отключить пробуждение от них. Наиболее распространенные устройства для USB включают EHC1, EHC2 и XHCI, например:
sudo sh -c "echo EHC1 > /proc/acpi/wakeup"
sudo sh -c "echo EHC2 > /proc/acpi/wakeup"
sudo sh -c "echo XHCI > /proc/acpi/wakeup"
Каждая из этих команд поочередно отключит возможность пробуждения для конкретного устройства. Рекомендуется проверить каждое устройство, пока не будет найдено то, которое отвечает за пробуждение системы от мыши.
Шаг 3: Автоматизация отключения пробуждения
Так как изменения, внесенные в /proc/acpi/wakeup
, не сохраняются после перезагрузки, следует автоматизировать этот процесс. Для этого можно использовать файл /etc/rc.local
. Если его нет, вы можете его создать следующим образом:
- Создайте файл
/etc/rc.local
и добавьте в него команды для отключения пробуждения:
#!/bin/sh -e
echo "EHC1" > /proc/acpi/wakeup
echo "EHC2" > /proc/acpi/wakeup
echo "XHCI" > /proc/acpi/wakeup
exit 0
- Сделайте файл исполняемым:
sudo chmod +x /etc/rc.local
- Проверьте, включен ли сервис
rc.local
:
sudo systemctl enable rc-local
Шаг 4: Использование udev-правил
Как более универсальный способ отключения пробуждения от конкретной мыши, вы можете создать правило udev
. Для этого создайте файл /etc/udev/rules.d/90-usb-wakeup.rules
со следующим содержанием:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", ATTR{idProduct}=="yyyy", ATTR{power/wakeup}="disabled"
Замените xxxx
и yyyy
на идентификаторы вашего устройства, которые можно узнать с помощью команды lsusb
.
После создания правила примените его без перезагрузки:
sudo udevadm control --reload-rules
Шаг 5: Проверка результата
Теперь после выполнения всех вышеуказанных шагов проверьте работоспособность системы. Переведите компьютер в режим сна и попробуйте изменить положения мыши. Если система не просыпается, значит, вы успешно отключили функцию пробуждения.
Заключение
Предотвращение случайного пробуждения компьютера от движений мыши требует некоторых усилий, но, следуя вышеуказанным шагам, вы сможете решить эту проблему. В случае возникновения вопросов, всегда можно обратиться к документации или сообществам поддержки Linux, чтобы получить дополнительную помощь. Оптимизация работы системы — это успешный шаг к комфортному использованию, обеспечивая стабильность и удобство работы.