systemd path单元开机时Pathexists未触发问题求助
我之前也碰到过类似的systemd.path开机不触发的问题,大概率是触发条件或者启动时机没配置对,给你几个排查和解决的方向:
1. 检查path单元的触发规则是否适配开机场景
默认的PathExists=只会在单元启动后检测文件从「不存在」变为「存在」的状态变化。如果开机时TrackPoint的sysfs配置文件(比如/sys/devices/platform/i8042/serio1/serio2/sensitivity)在path单元启动前就已经被udev创建好了,path单元就不会触发——因为它启动时文件已经存在,没有检测到状态变化。
解决办法:
- 把
PathExists=改成PathModified=,这样只要文件内容或属性变化就会触发(包括开机时文件已存在但后续可能被修改的场景); - 或者同时添加
PathChanged=,监控文件的创建、删除、修改等所有变化。
修改后的path单元示例:
[Unit] Description=Monitor TrackPoint sensitivity config file [Path] PathModified=/sys/devices/platform/i8042/serio1/serio2/sensitivity [Install] WantedBy=multi-user.target
2. 确保path单元在TrackPoint设备就绪后启动
TrackPoint的sysfs文件是由udev在设备枚举时创建的,如果path单元启动得太早,设备还没就绪,后续文件创建时它可能没检测到。
可以给path单元添加设备依赖,确保它在TrackPoint设备就绪后再启动:
[Unit] Description=Monitor TrackPoint sensitivity config file # 替换成你实际的TrackPoint设备路径,可通过`udevadm info -q path -n /sys/devices/platform/i8042/serio1/serio2`获取 BindsTo=sys-devices-platform-i8042-serio1-serio2.device After=sys-devices-platform-i8042-serio1-serio2.device [Path] PathModified=/sys/devices/platform/i8042/serio1/serio2/sensitivity [Install] WantedBy=multi-user.target
3. 查看日志排查触发细节
用journalctl查看开机时path和service单元的日志,能直接看到问题所在:
journalctl -u trackpoint-sensitivity.path -u trackpoint-sensitivity.service --boot
如果日志显示「Path exists, ignoring」,就说明是触发条件的问题;如果显示单元启动时设备还没就绪,就是依赖顺序的问题。
4. 更可靠的替代方案:用udev规则代替systemd.path
其实针对硬件设备的配置,udev规则比systemd.path更合适——udev是专门负责设备枚举和事件触发的,时机更准确。
创建一个udev规则文件/etc/udev/rules.d/99-trackpoint.rules:
# 匹配TrackPoint设备,可通过`udevadm info -a -p /sys/devices/platform/i8042/serio1/serio2`获取ATTR{name}的值 ACTION=="add", SUBSYSTEM=="serio", ATTR{name}=="TPPS/2 IBM TrackPoint", RUN+="/usr/local/bin/set-trackpoint-sensitivity.sh"
然后重新加载udev规则:
udevadm control --reload-rules
这样开机时TrackPoint设备一被识别,脚本就会自动执行,不用依赖systemd.path的监控。
内容的提问来源于stack exchange,提问作者Marvin

