当我的笔记本电脑连接到充电器或断开连接时,我试图让 udev 运行某些脚本。
为此,我创建了一个文件99-local.rules
并将/etc/udev/rules.d
以下内容放入其中:
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/sbin/onchg.sh"
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/sbin/onbatt.sh"
然而,文件就位后,系统似乎在“提升网络接口”目标期间挂起一段时间,在显示的 5 分钟中的 2 分钟后超时。
如果我删除该文件,那么它就可以正常工作。
udev 与网络接口启动有什么关系,如何才能使其启动速度尽可能快,但又保持这些规则?
答案1
udevadm settle
的输出中存在一种关系systemctl cat networking
:
ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ] && udevadm settle'
考虑一下man udev
关于RUN
密钥的内容:
这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止该设备或从属设备的所有进一步事件。
启动守护进程或其他长时间运行的进程不适合 udev;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。
答案2
Ferenc 提供的答案给了我一个线索,这个问题可能与我自己的脚本有关。
事实上,每当我对接/断开笔记本电脑时,脚本都应该切换 GPU 并重新启动 X 服务器 (LightDM)。
所以,看起来 udev 在启动期间执行了脚本,所以他们试图重新启动 X,但显然失败了。
onbat.sh
我将以下代码添加到/的顶部onchg.sh
,现在一切正常:
# Check if LightDM has already arrived
systemctl status lightdm | grep "running"
not_running=$?
if (( $not_running > 0 ))
then
# LightDM not arrived, exiting for now...
echo "LightDM not arrived, won't switch GPU."
exit
fi