温馨提示×

怎样调试linux trigger

小樊
42
2026-09-14 19:45:40
栏目: 智能运维

“Linux trigger” 这个说法在不同场景下含义差别很大,下面按常见场景分别说明怎么“调试”。你可以对号入座;如果都不是,请补充具体场景。


1. systemd 中的 trigger(unit 触发)

如果你说的是 systemd 的 trigger / 被其他 unit 触发

常见现象

  • service 没按预期启动
  • Wants= / Requires= / Triggers= 不生效
  • timer / path / socket 触发失败

调试方法

# 查看 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=
  • path/timer 是否 enabled

2. udev 规则 trigger(设备触发)

如果你是 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 写错
  • 权限问题(需要 reload)
udevadm control --reload

3. 内核 / 中断 trigger(IRQ trigger)

如果是 硬件中断触发(edge / level)

# 查看中断触发方式
cat /proc/interrupts

# 查看某个中断的 trigger 类型
cat /sys/kernel/irq/<irq>/trigger_type

调试通常结合:

  • dmesg
  • 内核日志
  • 驱动代码中的 request_irq()

4. 数据库 / 应用层 trigger(如 MySQL、PostgreSQL)

如果是 数据库 trigger 不执行

PostgreSQL

-- 查看 trigger
\df+ trigger_name

-- 手动调用函数测试
SELECT trigger_function();

MySQL

SHOW TRIGGERS;

调试方式:

  • 加日志表
  • 手动执行触发语句
  • 检查权限和 DEFINER

5. 自定义脚本 / 事件 trigger

如果你是自己写的“触发逻辑”(inotify / cron / socket)

inotify 示例

inotifywait -m /path

调试建议

  • set -x
  • 写日志文件
  • 手动执行触发命令验证

建议你补充的信息

为了给你更精确的调试方法,请告诉我:

  1. 具体是什么 trigger?
    • systemd / udev / 内核 / 数据库 / 自定义脚本
  2. 现象是什么?
    • 不触发?触发错误?重复触发?
  3. 相关配置或代码(可脱敏)

我可以直接帮你定位问题。

0