在 Linux 下,“trigger” 这个词出现在不同场景里,含义不完全一样。下面我按最常见的几种情况给你说明怎么“编写 trigger”。
systemd 本身没有“trigger 文件”,但常通过:
*.service*.timer(定时触发)*.path(文件变化触发)*.socket(网络/套接字触发)来实现“trigger”行为。
.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
.timer 定时触发(cron 替代)[Timer]
OnCalendar=*-*-* 03:00:00
Unit=backup.service
当 USB、磁盘等插入时执行脚本。
/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
适合写自己的监听程序。
#!/bin/bash
inotifywait -m -e create /tmp |
while read path action file; do
echo "$file $action" >> /var/log/inotify.log
done
如果你说的是数据库 trigger:
CREATE TRIGGER after_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO log(user_id) VALUES (NEW.id);
END;
你可以告诉我:
我可以直接给你可运行的完整示例。