当前位置: 首页>>技术教程>>正文


如何防止鼠标移动唤醒挂起的计算机?

,

问题描述

这真的很烦人,因为我必须在暂停后拔掉鼠标,以确保偶尔的碰撞不会唤醒系统。我在系统设置中没有找到任何可以通过谷歌搜索禁用此功能的内容。

最佳方法

我还没有检查BIOS,但我已经找到了解决方案!

简短摘要:在 /proc/acpi/wakeup 中,您可以查看当前启用了哪些设备从挂起状态恢复。该列表显示了所谓的 “Devices” 的名称(缩写)。示例 “PWRB” 表示 “power button”。

如果将 device-names 写入该文件,则可以在启用/禁用之间切换它们。

我根据在其中找到该信息的博客编写了 a small HowTo for disabling wakeup-by-mouse

次佳方法

感谢所有发帖者,因为鼠标唤醒给我带来了很大的不便,我在这里得到了答案。我希望在解决方案中添加我的想法,因为这可能在更多情况下有所帮助。我必须禁用 /proc/acpi/wakeup 中的 3 个不同项目。我的设备: EHC1, EHC2, XHCI 。前 2 个是 USB2,第三个是 USB3 条目。请注意,虽然我的鼠标的 USB 收发器已插入 USB2 端口,并且任何 USB3 端口中都没有任何内容,但计算机将在鼠标移动时唤醒,直到所有 3 个项目都被禁用。

$ cat /proc/acpi/wakeup | sort 
Device  S-state   Status   Sysfs node
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 下作为 enabled 发布的每个项目,测试哪些项目需要禁用(如 here 所示),方法是在终端中运行以下每个命令,然后测试鼠标是否唤醒系统(无需重新启动):

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文件不存在

根据 this 帖子,运行:

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

以下 How to Enable /etc/rc.local with Systemd

创建文件:

sudo nano /etc/systemd/system/rc-local.service

然后添加以下内容。

[Unit]
 Description=/etc/rc.local Compatibility
 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 (根据需要修改 idVendoridProduct,请参阅 lsusb 的输出,它以以下形式提供 ID: vendor:product ):

# Disable waking up from Logitech unified receiver
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", ATTR{power/wakeup}="disabled"

要在不重新启动的情况下应用它:

  1. 跑步:

    \n

    sudo udevadm control --reload-rules\n

    \n

  2. 断开并重新连接 USB 设备。\n

灵感来自https://wiki.archlinux.org/title/udev#Waking_from_suspend_with_USB_device

第四种方法

此解决方案适用于 Ubuntu 15.10、18.04、20.04、22.04

通过拔下并重新插入鼠标并搜索 /sys/bus/usb/devices/* 文件夹来查找鼠标 idProduct 和 idVendor。忽略名称中带有 : 的链接。例如,点击 3-3 的链接,但\n忽略 3-3:1.0

现在尝试读取 idProduct 和 idVendor。例如:\n cat /sys/bus/usb/devices/7-2.3/idProduct => 2000 ,\n cat /sys/bus/usb/devices/7-2.3/idVendor => 24ae

最后我在/lib/systemd/system-sleep目录中创建一个脚本,将其命名为mouse-suspend.sh

#!/bin/bash

# From lsusb: Bus 007 Device 008: ID 24ae:2000
idProduct=2000
idVendor=24ae

# Get sys device path by vendorId and productId
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 not found 1>&2
    exit 1
fi

case "$1" in
    enabled|disabled)
    echo $1 > "$sysdev/power/wakeup"
    ;;
    *)
    echo "$0 enabled   -- to enable the wakeup for this device"
    echo "$0 disabled  -- to disable the wakeup for this device"
    ;;
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 )有效,但它很粗糙,而且它还禁用了键盘唤醒,这实际上很有用。

更精细的替代方案可以是这样的:\n首先,我们首先枚举连接到系统的 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 是必需的,否则系统将不允许重定向到特权文件。

然后,只需暂停系统并验证鼠标不会唤醒系统,而键盘会唤醒它。

这不会在系统重新启动后继续存在,因此您需要 re-run 最后一个命令,或者将其添加到 .bashrc.zshrc

自从我安装 16.04 以来,这个问题在 Ubuntu 上一直困扰着我,而且可能永远存在,我不明白为什么 Canonical 不会在系统设置中添加它。

来源:https://codetrips.com/2020/03/18/ubuntu-disable-mouse-wake-from-suspend/

第六种方法

可笑,但是插拔、插回来确定设备代码的方法是最不繁琐的。所以:

  1. 寻找

grep . /sys/bus/usb/devices/*/power/wakeup | grep enabled

使用 plug-out-plug-in 方法找出罪犯

  1. 禁用

sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/YOUR_DEVICE/power/wakeup"

受到这个 blog post 的启发

第七种方法

对我有用的解决方案是从 here 获得的。

首先,我们首先枚举连接到系统的 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"

(注意:每次需要以超级用户身份回显时,都需要 sh -c,否则系统将不允许重定向到特权文件)。

然后,只需暂停系统并验证鼠标不会唤醒系统,而键盘会唤醒它。

这不会在系统重新启动后继续存在,因此您需要 re-run 最后一个命令,或者将其添加到您的 .bashrc 或 .zshrc

重新启动后运行命令\n运行命令 sudo crontab -e \n然后在新行中添加 @reboot 和要在重新启动后运行的命令。例如:\n @reboot sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/3-3/power/wakeup" 保存文件并尝试重新启动计算机。不要将此命令添加到您的 .bashrc 中,它可能会阻止您的计算机启动。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14069.html,未经允许,请勿转载。