在 Linux 里,“trigger 脚本”这个说法可能对应几种不同场景。下面我分常见情况给你讲,并给出可直接用的示例。
如果你说的是:某个服务启动/停止/状态变化时,自动执行脚本,那是 systemd 的 service + path/timer/socket 机制。
# /etc/systemd/system/my-trigger.service
[Unit]
Description=Run script after myapp starts
After=myapp.service
[Service]
Type=oneshot
ExecStart=/opt/scripts/trigger.sh
[Install]
WantedBy=multi-user.target
启用:
systemctl enable my-trigger.service
当某个文件或目录变化时触发脚本。
# /etc/systemd/system/watch.conf.path
[Path]
PathModified=/etc/myapp/config.conf
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/watch.conf.service
[Service]
ExecStart=/opt/scripts/on_change.sh
systemctl enable watch.conf.path
systemctl start watch.conf.path
#!/bin/bash
inotifywait -m -e modify /var/log/app.log | while read
do
/opt/scripts/trigger.sh
done
# 每天 3 点执行
0 3 * * * /opt/scripts/trigger.sh
# trigger.timer
[Timer]
OnCalendar=*-*-* 03:00:00
[Install]
WantedBy=timers.target
USB 插拔、磁盘接入时触发脚本。
# /etc/udev/rules.d/99-usb.rules
ACTION=="add", SUBSYSTEM=="usb", RUN+="/opt/scripts/usb_trigger.sh"
udevadm control --reload
#!/bin/bash
set -e
LOG=/var/log/trigger.log
echo "$(date) trigger fired" >> $LOG
# 你的逻辑
systemctl restart myapp
chmod +x /opt/scripts/trigger.sh
我可以给你更精确的一整套配置。