CentOS 触发器的常见实现与部署
在 CentOS 环境中,“触发器”通常对应以下几类需求:按时间周期执行(定时)、按系统事件执行(systemd 定时器/一次性任务)、按文件变化执行(inotify)、按数据库操作执行(数据库触发器)、以及外部系统触发的 CI/CD 流水线(如 Jenkins 的远程构建触发)。下面给出可直接落地的部署方法与要点。
一 定时触发 Cron 部署
- 安装与启动
- 安装组件:yum install -y cronie yum-cron
- 启动与开机自启:systemctl start crond && systemctl enable crond
- 编辑任务
- 当前用户:crontab -e
- 系统级:/etc/crontab(需在命令前指定运行用户)
- 时间格式
- 5 字段:分 时 日 月 周;示例:每天 02:30 执行 → 30 2 * * * /usr/local/bin/backup.sh
- 常用管理
- 查看:crontab -l;删除:crontab -r;指定用户:crontab -u app -l
- 日志与排错
- 查看执行日志:/var/log/cron
- 常见问题:脚本与路径使用绝对路径、设置 SHELL/PATH、脚本具备可执行权限、必要时在命令前显式调用 /bin/bash。
二 系统事件触发 systemd 定时器与一次性任务
- 场景 A:周期性任务(替代部分 cron)
- 服务单元:/etc/systemd/system/hello.service
[Unit]
Description=Hello Job
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/hello.sh
- 定时器单元:/etc/systemd/system/hello.timer
[Unit]
Description=Run hello.service every 5 minutes
Requires=hello.service
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
- 启用与启动:systemctl daemon-reload && systemctl enable --now hello.timer
- 查看与日志:systemctl list-timers --all、journalctl -u hello.timer -u hello.service
- 场景 B:一次性延时任务
- 延时 1 分钟执行:systemd-run --on-active=1min /usr/local/bin/one_time.sh
- 说明
- systemd 定时器具备精确计时、持久化、依赖管理等优势,适合与系统服务编排深度集成。
三 文件变化触发 inotify 部署
- 安装工具
- yum install -y inotify-tools
- 守护脚本示例(监控目录创建/修改/删除并触发处理脚本)
#!/usr/bin/env bash
WATCH_DIR="/data/incoming"
LOG="/var/log/inotify.log"
inotifywait -m -e create,modify,delete,move --format '%w%f %e' "$WATCH_DIR" | while IFS= read -r file event; do
echo "$(date '+%F %T') $event $file" >> "$LOG"
/usr/local/bin/handle.sh "$file" "$event"
done
- 部署要点
- 将脚本加入 systemd 管理并设置 Restart=always,确保常驻运行
- 处理脚本使用绝对路径、做好幂等与异常日志,避免事件洪泛。
四 数据库触发器部署 MySQL 示例
五 CI/CD 外部触发 Jenkins 远程构建
- 令牌触发
- 构建 URL:JENKINS_URL/job//build?token=
- 示例:http://192.168.174.30:8080/jenkins/job/text1/build?token=123
- 定时构建
- 使用 Cron 语法在 Jenkins 任务中配置定时(与系统 crontab 语法相近)
- GitLab Webhooks
- 在 GitLab 项目设置 Webhooks,指向 Jenkins 的 Build when a change is pushed to GitLab 触发器
- 需允许本地网络出站请求(管理员设置),并在 Jenkins 系统配置中启用相关插件与安全策略
- 适用场景
- 代码推送、合并请求、定时流水线、跨项目构建联动等自动化流程。