centos触发器定制化方法
导读:CentOS 触发器定制化方法 一、方案总览与选型 systemd Timer:适合基于时间的周期/一次性的任务(如每天02:00执行备份),具备开机补执行、日志集成等优势。 systemd path 单元:适合基于文件系统事件的触发(如...
CentOS 触发器定制化方法
一、方案总览与选型
- systemd Timer:适合基于时间的周期/一次性的任务(如每天02:00执行备份),具备开机补执行、日志集成等优势。
- systemd path 单元:适合基于文件系统事件的触发(如文件创建/修改),轻量、内核事件驱动。
- inotifywait 脚本:适合复杂文件事件编排(多目录、防抖、合并事件、执行前后置动作)。
- cron:适合简单周期任务,配置快速,但缺少事件驱动与精细依赖管理。
- 数据库触发器:若需求是在数据库表上自动执行业务逻辑(如插入前填充字段),使用 MySQL/MariaDB 的触发器实现。
以上方案覆盖系统运维与数据库两类常见“触发器”诉求,可按场景组合使用。
二、systemd Timer 时间触发
- 步骤
- 创建服务单元:/etc/systemd/system/backup.service
[Unit] Description=Daily Backup After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh [Install] WantedBy=multi-user.target- 创建定时器:/etc/systemd/system/backup.timer
[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 systemctl list-timers --all journalctl -u backup.service -b - 要点
- 使用 OnCalendar 表达日历时间;Persistent=true 可在宕机/关机错过时补执行。
- 需要“相对时间/间隔”可用 OnBootSec=、OnUnitActiveSec= 等。
- 服务建议设为 Type=oneshot,由定时器负责周期调度。
三、systemd path 与 inotifywait 文件事件触发
- systemd path(内核 inotify 封装,适合简单场景)
- 服务单元:/etc/systemd/system/handle_upload.service
[Unit] Description=Handle uploaded file After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/process_upload.sh %f- 路径单元:/etc/systemd/system/handle_upload.path
[Unit] Description=Watch /data/upload for new files [Path] PathModified=/data/upload DirectoryNotEmpty=/data/upload [Install] WantedBy=multi-user.target- 生效
sudo systemctl daemon-reload sudo systemctl enable --now handle_upload.path journalctl -u handle_upload.service -f - inotifywait 脚本(复杂编排与防抖)
- 安装工具
sudo yum install -y inotify-tools- 示例脚本(防抖合并事件,5 秒稳定窗口)
#!/usr/bin/env bash WATCH_DIR="/data/upload" SCRIPT="/usr/local/bin/process_upload.sh" LOCK="/tmp/handle_upload.lock" INOTIFYWAIT="/usr/bin/inotifywait" mkdir -p "$WATCH_DIR" "$INOTIFYWAIT" -m -r -e create,modify,delete --format '%w%f %e' "$WATCH_DIR" | while IFS=' ' read -r file event; do # 简单去重:同一文件在短时间多次变更只处理一次 if ( set -C; flock -n 9; ) 9> "$LOCK"; then sleep 5 if [[ -f "$file" ]]; then "$SCRIPT" "$file" "$event" fi rm -f "$LOCK" fi done- 以 systemd 管理守护进程(/etc/systemd/system/file_watcher.service)
[Unit] Description=File watcher for upload After=network.target [Service] Type=simple ExecStart=/usr/local/bin/file_watcher.sh Restart=on-failure [Install] WantedBy=multi-user.target - 要点
- path 单元事件包括 PathModified/PathCreated/PathDeleted 等;适合“有文件就处理”。
- inotifywait 适合“多目录、复杂规则、合并抖动、执行前后置动作”的场景。
四、cron 与数据库触发器
- cron(简单周期任务)
查看与管理:crontab -e/-l;日志:/var/log/cron。# 每天 02:00 执行 0 2 * * * /usr/local/bin/backup.sh # 每 5 分钟执行 */5 * * * * /usr/local/bin/healthcheck.sh - MySQL/MariaDB 触发器(数据层自动化)
要点:触发器属于数据库对象,与操作系统事件无关,适合在INSERT/UPDATE/DELETE 前后执行业务规则。DELIMITER // CREATE TRIGGER before_insert_user BEFORE INSERT ON users FOR EACH ROW BEGIN IF NEW.status IS NULL THEN SET NEW.status = 'active'; END IF; END // DELIMITER ;
五、实践建议与排错清单
- 选择建议
- 纯时间调度:优先 systemd Timer;极简任务可用 cron。
- 文件事件:简单用 path,复杂用 inotifywait 脚本。
- 数据库约束/填充:使用 数据库触发器。
- 稳定性与幂等
- 脚本需具备幂等性(可重复执行无副作用);必要时加锁/去重/状态标记。
- 日志与诊断
- 统一用 journalctl 查看服务/定时器日志:journalctl -u your.service -b;定时器列表:systemctl list-timers --all。
- 常见坑
- 修改单元后未执行 systemctl daemon-reload。
- 定时器未启用:启用对应 .timer 单元而非 .service。
- SELinux/权限导致脚本不可执行:检查 chmod +x 与 SELinux 布尔值/策略。
- inotify 监控过多目录导致 fd 耗尽:合理限定路径与事件,必要时分批监控。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos触发器定制化方法
本文地址: https://pptw.com/jishu/756685.html
