温馨提示×

CentOS Trigger最佳实践

小樊
44
2025-12-27 10:44:34
栏目: 智能运维

CentOS Trigger 最佳实践

一 场景与选型

  • 定时触发:使用 systemd Timers(推荐)或 Cron。Timers 具备依赖管理、日志归集、开机补偿等能力;Cron 简单直观,适合轻量任务。
  • 文件变化触发:使用 inotifywait(inotify-tools)监听目录/文件的 create、modify、delete 等事件,触发脚本处理。
  • 设备热插拔触发:使用 Udev 规则在设备插入/移除时执行脚本(如外置盘、USB 设备)。
  • 一次性任务:使用 systemd one-shot Timerat(适合维护窗口、首次引导后初始化等)。
  • 服务编排与依赖:使用 systemd 服务单元的 After/Requires/Restart 等语义进行编排,必要时以定时器驱动。

二 通用落地步骤

  • 明确触发源与动作:定义事件条件(时间、路径、设备、信号等)与要执行的命令/脚本。
  • 准备可执行单元:脚本具备可执行权限,使用绝对路径,处理好环境变量与用户上下文(如 sudo -u)。
  • 配置 systemd 单元:区分 .service(执行逻辑)与 .timer(时间/事件驱动);必要时设置 Type=oneshot、Restart、ExecReload 等。
  • 使配置生效:执行 systemctl daemon-reload,按需 enable/start/status 单元或定时器。
  • 日志与排错:用 journalctl -u -b 查看输出;为脚本输出到 syslog 或文件,便于审计与回溯。

三 关键场景示例

  • 定时触发(每小时执行)
    • 服务单元:/etc/systemd/system/hello.service
      [Unit]
      Description=Hourly Hello
      [Service]
      Type=oneshot
      ExecStart=/usr/bin/echo "Hello at $(date +%%F %%T)"
      
    • 定时器单元:/etc/systemd/system/hello.timer
      [Unit]
      Description=Run hello hourly
      [Timer]
      OnCalendar=hourly
      Persistent=true
      [Install]
      WantedBy=timers.target
      
    • 启用:systemctl daemon-reload && systemctl enable --now hello.timer
  • 文件变化触发(inotifywait)
    • 安装:sudo yum install -y inotify-tools
    • 监听脚本:
      #!/usr/bin/env bash
      WATCH=/var/lib/myapp/incoming
      inotifywait -m -e create,modify,delete --format '%e %w%f' "$WATCH" | while IFS= read -r event file; do
        /usr/local/bin/handle.sh "$event" "$file"
      done
      
  • 设备热插拔触发(Udev)
    • 规则:/etc/udev/rules.d/99-usb-backup.rules
      ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", RUN+="/usr/local/bin/usb-backup.sh %k"
      
    • 生效:sudo udevadm control --reload-rules && sudo udevadm trigger
  • 一次性任务(指定用户)
    • 服务:/etc/systemd/system/run-once.service
      [Unit]
      Description=Run once as user1
      [Service]
      Type=oneshot
      ExecStart=/bin/bash -c "sudo -u user1 /opt/scripts/setup.sh"
      
    • 定时器:/etc/systemd/system/run-once.timer
      [Unit]
      Description=Run once timer
      [Timer]
      OnBootSec=1min
      Persistent=false
      [Install]
      WantedBy=timers.target
      
    • 启用:systemctl daemon-reload && systemctl enable --now run-once.timer

四 稳定性与运维要点

  • 幂等与可重入:脚本需支持重复执行(判断锁文件/状态、避免重复处理同一文件)。
  • 超时与并发:为服务设置 TimeoutStartSec/TimeoutStopSec,必要时用 ExecStartPre/ExecStartPost 做准备与清理;避免并发启动冲突。
  • 日志与审计:统一用 journald 或 syslog,记录开始/结束时间、事件源、返回码;关键路径加 set -eux 与错误捕获。
  • 权限最小化:以最小权限用户运行脚本;如需提权,使用 sudo 精细化授权,避免以 root 直接执行不可信代码。
  • 资源与信号:为长时间任务设置 WatchdogSec 或健康探针;正确处理 SIGTERM 做优雅退出。
  • 幂等定时与补偿:对错过执行的任务使用 Persistent=true 或业务侧补偿逻辑,避免漏执行或重复执行。
  • 监控与告警:为关键触发器建立 systemd 状态脚本返回码监控,异常时及时告警。

五 常见陷阱与规避

  • 路径与解释器:脚本首行 #!/usr/bin/env bash 并使用绝对路径;cron/Timers 环境与交互式 shell 不同,显式设置 PATHLANG
  • 并发与锁:inotify 可能产生事件风暴,使用 -m 持续监听并加锁(flock)避免并发处理同一批次文件。
  • 设备节点竞争:Udev 触发可能早于挂载完成,必要时在脚本中等待设备/分区就绪(如 inotifywait 目标目录或 systemd 依赖)。
  • 定时器精度与补偿:OnCalendar 精度为分钟级;若系统关机错过执行,启用 Persistent=true 或自行补偿。
  • 变更生效:修改 .service/.timer 后务必 systemctl daemon-reload;变更后先 status 验证,再投入生产。

0