温馨提示×

linux trigger如何编写

小樊
38
2026-10-23 05:37:07
栏目: 智能运维

在 Linux 下,“trigger” 这个词出现在不同场景里,含义不完全一样。下面我按最常见的几种情况给你说明怎么“编写 trigger”。


一、systemd 中的 trigger(最常见)

1️⃣ 什么是 systemd trigger

systemd 本身没有“trigger 文件”,但常通过:

  • *.service
  • *.timer(定时触发)
  • *.path(文件变化触发)
  • *.socket(网络/套接字触发)

来实现“trigger”行为。


2️⃣ 用 .path 实现“文件变化触发”(最像 trigger)

当某个文件或目录发生变化时,触发一个服务。

示例:文件出现就执行脚本

/etc/systemd/system/watch.conf.path

[Unit]
Description=Watch a file

[Path]
PathExists=/tmp/trigger.txt
Unit=trigger.service

[Install]
WantedBy=multi-user.target

/etc/systemd/system/trigger.service

[Unit]
Description=Run on trigger

[Service]
ExecStart=/usr/local/bin/do_something.sh

脚本 /usr/local/bin/do_something.sh

#!/bin/bash
echo "Triggered at $(date)" >> /var/log/trigger.log
rm -f /tmp/trigger.txt

启用:

systemctl enable --now watch.conf.path

3️⃣ 用 .timer 定时触发(cron 替代)

[Timer]
OnCalendar=*-*-* 03:00:00
Unit=backup.service

二、udev 中的 trigger(硬件触发)

当 USB、磁盘等插入时执行脚本。

示例:U 盘插入触发脚本

/etc/udev/rules.d/99-usb.rules

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", RUN+="/usr/local/bin/usb_trigger.sh"

脚本:

#!/bin/bash
echo "USB inserted" >> /var/log/usb.log

重新加载:

udevadm control --reload

三、inotify 写 trigger 脚本(用户态)

适合写自己的监听程序。

#!/bin/bash
inotifywait -m -e create /tmp |
while read path action file; do
    echo "$file $action" >> /var/log/inotify.log
done

四、数据库中的 TRIGGER(如 MySQL / PostgreSQL)

如果你说的是数据库 trigger:

CREATE TRIGGER after_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
    INSERT INTO log(user_id) VALUES (NEW.id);
END;

五、你指的是哪一种?

你可以告诉我:

  • ✅ systemd 触发?
  • ✅ 文件/目录变化触发?
  • ✅ 硬件插入触发?
  • ✅ 数据库 trigger?
  • ✅ 内核 / eBPF trigger?

我可以直接给你可运行的完整示例。

0 踩