在 Ubuntu(以及一般的 Linux 系统)中,“trigger 规则”通常出现在以下几种语境中。我先帮你梳理常见的几种,并给出写法示例,你可以对照自己的使用场景:
在 Ubuntu 中,很多“触发规则”是通过 systemd unit 实现的,比如:
Wants / After)# /etc/systemd/system/b.service
[Unit]
Description=Service B
After=a.service
Requires=a.service
[Service]
ExecStart=/usr/bin/echo "B triggered by A"
[Install]
WantedBy=multi-user.target
A 启动时会触发 B(通过 Wants= 或 Requires=)。
当某个文件或目录发生变化时触发:
# /etc/systemd/system/watch.conf.path
[Unit]
Description=Watch config file
[Path]
PathModified=/etc/myapp/config.conf
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/watch.conf.service
[Unit]
Description=Reload on config change
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart myapp
启用:
systemctl enable watch.conf.path
systemctl start watch.conf.path
插上 USB 设备时触发脚本:
# /etc/udev/rules.d/99-usb-trigger.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", RUN+="/usr/local/bin/usb.sh"
然后:
udevadm control --reload
Ubuntu 使用 dpkg 的 triggers 机制,在软件包安装/升级后自动执行操作。
# debian/triggers
interest /usr/share/myapp/templates
# 在 postinst 中处理
case "$1" in
configure)
if [ "$2" = "triggered" ]; then
/usr/bin/rebuild-myapp
fi
;;
esac
虽然不是严格 trigger,但可用时间或条件触发:
@reboot /usr/local/bin/init.sh
*/5 * * * * /usr/local/bin/check_and_run.sh
如果是你自己的程序,可以:
inotifywait 监听文件例如 inotify:
inotifywait -m /tmp | while read event; do
/usr/local/bin/handler.sh
done
我可以直接给你一份“可复制即用”的规则模板。