用 Linux 触发器把重复工作自动化,关键在于选对触发机制、降低触发链路开销、做好可观测与幂等。下面给出可直接落地的选型、配置与优化方案。
| 触发方式 | 典型场景 | 关键工具 | 快速示例 |
|---|---|---|---|
| 定时触发 | 日志轮转、报表生成、定时备份 | Cron、systemd Timers | 每天 02:00 备份:0 2 * * * /path/backup.sh |
| 文件系统事件 | 代码保存即构建、配置变更即重载 | inotifywait(inotify-tools) | `inotifywait -m . -e modify |
| 系统事件与服务编排 | 开机自启、依赖就绪后启动、路径/设备就绪触发 | systemd service/timer、udev | ACTION=="add", SUBSYSTEM=="usb", RUN+="/path/on_usb.sh" |
| 代码提交触发 CI/CD | Push/PR 自动构建、测试、部署 | Jenkins | 配置“轮询 SCM”或“Webhook”触发任务 |
| 日志与关键字触发 | 错误关键字告警、异常行为处置 | Logwatch、ELK | 监控日志出现 ERROR 时执行脚本 |
| 信号与进程生命周期 | 优雅停机、清理临时资源 | trap、信号 | trap 'cleanup' SIGTERM |
| 容器生命周期钩子 | 容器启动/停止前后执行脚本 | Docker | docker run --init ... 或 entrypoint 钩子 |
| 以上方式覆盖了大多数开发场景,从时间到事件、从系统到应用均可编排。 |
crontab -e0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
sudo apt-get install inotify-tools(Debian/Ubuntu)#!/usr/bin/env bash
set -euo pipefail
inotifywait -m -e modify,create,delete . | while IFS= read -r path action file; do
echo "[$(date)] $action $file, building..."
./build.sh
done
/etc/systemd/system/daily.service:[Unit]
Description=Daily Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
/etc/systemd/system/daily.timer:[Unit]
Description=Run backup daily at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload && sudo systemctl enable --now daily.timer/etc/udev/rules.d/99-usb.rules:ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", RUN+="/usr/local/bin/on_usb.sh"
sudo udevadm control --reload-rules && sudo udevadm triggerH/5 * * * * 每 5 分钟轮询)或配置 Webhook → 构建步骤执行构建/测试/部署。