“Linux trigger” 这个说法在不同场景下含义差别很大,下面按常见场景分别说明怎么“调试”。你可以对号入座;如果都不是,请补充具体场景。
如果你说的是 systemd 的 trigger / 被其他 unit 触发
Wants= / Requires= / Triggers= 不生效# 查看 unit 状态和触发链
systemctl status xxx.service
systemctl list-dependencies xxx.service
# 查看为什么被触发
journalctl -u xxx.service -b
journalctl -u xxx.trigger -b
# 手动触发测试
systemctl trigger xxx.service
systemctl start xxx.service
# 查看 unit 文件
systemctl cat xxx.service
After= / Requires= / Wants=PartOf= / TriggeredBy=如果你是 udev rule 没触发 / 触发错误
# 手动触发所有设备
udevadm trigger
# 触发指定设备
udevadm trigger --action=add /sys/class/xxx
# 监控 udev 事件
udevadm monitor
# 测试某条规则是否匹配
udevadm test /sys/class/xxx/yyy
# 查看设备属性(写规则用)
udevadm info -a -p /sys/class/xxx/yyy
/etc/udev/rules.d/)SUBSYSTEM / ATTR 写错udevadm control --reload
如果是 硬件中断触发(edge / level)
# 查看中断触发方式
cat /proc/interrupts
# 查看某个中断的 trigger 类型
cat /sys/kernel/irq/<irq>/trigger_type
调试通常结合:
dmesgrequest_irq()如果是 数据库 trigger 不执行
-- 查看 trigger
\df+ trigger_name
-- 手动调用函数测试
SELECT trigger_function();
SHOW TRIGGERS;
调试方式:
DEFINER如果你是自己写的“触发逻辑”(inotify / cron / socket)
inotifywait -m /path
set -x为了给你更精确的调试方法,请告诉我:
我可以直接帮你定位问题。