Ubuntu自定义触发器的实用方案
一、方案总览与选择
二、按场景给出可直接使用的配置
systemd 定时器(按时间触发)
[Unit]
Description=Run backup script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
[Unit]
Description=Run backup daily at 02:00
Requires=backup.service
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
sudo systemctl list-timers --all
说明:OnCalendar 支持丰富的时间语法;Persistent=true 可在关机错过时补执行。
systemd Path 单元(文件变化触发)
#!/usr/bin/env bash
echo "$(date) changed: $1" >> /var/log/path-trigger.log
chmod +x /usr/local/bin/handle_path.sh 2) 创建服务单元:/etc/systemd/system/path-handler.service
[Unit]
Description=Handle path changes
[Service]
Type=oneshot
ExecStart=/usr/local/bin/handle_path.sh "%f"
[Path]
PathModified=/var/www/html
PathCreated=/var/www/html
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now path-handler.path
说明:Path 单元会在匹配路径发生事件时启动对应服务;适合“文件落地即处理”。
inotifywait 守护进程(文件事件触发)
sudo apt-get update && sudo apt-get install -y inotify-tools
#!/usr/bin/env bash
MON_DIR="/var/www/html"
inotifywait -m -e create,modify,delete --format '%w%f %e' "$MON_DIR" | while IFS= read -r file event; do
/usr/local/bin/handle_path.sh "$file"
done
建议将以上脚本配置为 systemd 服务(Type=simple),以便开机自启与日志归集。
Udev 规则(设备插拔触发)
udevadm monitor
# 插入设备观察输出,或用
udevadm info -a -n /dev/sdb
# 示例:匹配特定厂商/产品ID的USB存储
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
RUN+="/usr/local/bin/usb-added.sh '%k'"
ACTION=="remove", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
RUN+="/usr/local/bin/usb-removed.sh '%k'"
sudo udevadm control --reload-rules
sudo udevadm trigger
说明:udev 在设备节点出现/消失时运行脚本,适合挂载、拍照设备、串口等外设自动化。
Cron(定时触发)
crontab -e
0 2 * * * /usr/local/bin/backup.sh
说明:简单可靠;复杂依赖与日志管理建议改用 systemd 定时器。
三、调试与最佳实践
以上方案覆盖了时间、文件、设备三大类常见触发源,并给出可复制的最小配置与调试方法。按你的具体事件源选择其一或组合使用即可。