温馨提示×

Linux Trigger能定制吗

小樊
75
2025-11-15 17:32:42
栏目: 智能运维

可以,而且有多种成熟方式按时间、事件或系统状态来自定义 Linux 的“触发器”。常见做法包括:基于时间的 cron 与 systemd Timer,基于事件的 inotify 文件监控与 udev 设备事件,以及系统级事件与登录会话的 systemd 路径/服务单元 等。下面给出对照与可直接复用的示例。

常见场景与工具选择

场景 推荐工具 关键配置点
按时间周期执行 cron、systemd Timer cron 使用五字段时间语法;Timer 使用 OnCalendar 等字段
文件或目录变更 inotifywait(inotify-tools) 监控 create/modify/delete 等事件并调用脚本
设备插拔 udev 规则 匹配 ACTION/SUBSYSTEM/ATTR 并执行脚本
系统启动、登录、路径变化 systemd service/timer/path After/Requires/WantedBy;Path Unit 的 PathChanged 等
登录/会话事件 systemd-logind 监听会话状态变化触发动作

快速上手示例

  • 定时触发(每小时执行)

    • cron
      # 编辑当前用户定时任务
      crontab -e
      # 每小时执行一次
      0 * * * * /usr/local/bin/backup.sh
      
    • systemd Timer
      # /etc/systemd/system/backup.service
      [Unit]
      Description=Hourly Backup
      
      [Service]
      Type=oneshot
      ExecStart=/usr/local/bin/backup.sh
      
      # /etc/systemd/system/backup.timer
      [Unit]
      Description=Run backup hourly
      
      [Timer]
      OnCalendar=*-*-* *:00:00
      Persistent=true
      
      [Install]
      WantedBy=timers.target
      
      启用与查看:
      sudo systemctl daemon-reload
      sudo systemctl enable --now backup.timer
      systemctl list-timers --all
      
  • 文件变更触发(inotifywait)

    # 安装工具
    sudo apt-get install inotify-tools    # Debian/Ubuntu
    sudo yum install inotify-tools      # CentOS/RHEL
    
    # 监控目录并在事件发生时执行脚本
    inotifywait -m /data/watch -e create,modify,delete |
    while read path action file; do
        /usr/local/bin/handle.sh "$path" "$action" "$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
    

实践建议

  • 权限与安全:涉及系统级动作(如重启服务、挂载设备)时,使用 sudo 或将脚本放入受控目录并设置合适的权限;避免在触发器中执行不受信任的命令。
  • 幂等与可重入:为脚本增加锁文件或状态判断,防止重复执行造成副作用(如重复备份、重复重启)。
  • 日志与排错:将脚本输出重定向到日志(如 /var/log/trigger.log),并使用 systemctl status/ journalctl -u 查看定时/服务单元的运行情况;inotify 脚本建议记录事件细节以便审计。
  • 测试与环境:先在测试环境验证触发器逻辑与边界条件,再推广到生产;对关键业务增加回滚与告警机制。

0 踩