温馨提示×

ubuntu怎样自定义触发器

小樊
36
2026-01-11 16:27:42
栏目: 智能运维

Ubuntu自定义触发器的实用方案

一、方案总览与选择

  • systemd 服务 + 定时器:适合按时间/日历系统事件触发的任务,支持持久化、日志与依赖管理。
  • systemd Path 单元:基于文件/目录变化(创建、修改、删除)触发,轻量且原生集成。
  • inotifywait 守护进程:用户态监控,适合复杂逻辑、过滤与多目录场景。
  • Udev 规则:面向设备插拔(USB、磁盘、外设)触发的系统级自动化。
  • Cron:传统的定时任务,简单场景依然高效。

二、按场景给出可直接使用的配置

  • systemd 定时器(按时间触发)

    1. 创建服务单元:/etc/systemd/system/backup.service
    [Unit]
    Description=Run backup script
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/backup.sh
    
    1. 创建定时器单元:/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
    
    1. 启用与启动
    sudo systemctl daemon-reload
    sudo systemctl enable --now backup.timer
    sudo systemctl list-timers --all
    

    说明:OnCalendar 支持丰富的时间语法;Persistent=true 可在关机错过时补执行。

  • systemd Path 单元(文件变化触发)

    1. 监控脚本:/usr/local/bin/handle_path.sh
    #!/usr/bin/env bash
    echo "$(date) changed: $1" >> /var/log/path-trigger.log
    

    chmod +x /usr/local/bin/handle_path.sh 2) 创建服务单元:/etc/systemd/system/path-handler.service

    [Unit]
    Description=Handle path changes
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/handle_path.sh "%f"
    
    1. 创建路径单元:/etc/systemd/system/path-handler.path
    [Path]
    PathModified=/var/www/html
    PathCreated=/var/www/html
    
    [Install]
    WantedBy=multi-user.target
    
    1. 启用
    sudo systemctl daemon-reload
    sudo systemctl enable --now path-handler.path
    

    说明:Path 单元会在匹配路径发生事件时启动对应服务;适合“文件落地即处理”。

  • inotifywait 守护进程(文件事件触发)

    1. 安装工具
    sudo apt-get update && sudo apt-get install -y inotify-tools
    
    1. 启动监控(示例监控 /var/www/html 的创建/修改/删除)
    #!/usr/bin/env bash
    MON_DIR="/var/www/html"
    inotifywait -m -e create,modify,delete --format '%w%f %e' "$MON_DIR" | while IFS= read -r file event; do
        /usr/local/bin/handle_path.sh "$file"
    done
    

    建议将以上脚本配置为 systemd 服务(Type=simple),以便开机自启与日志归集。

  • Udev 规则(设备插拔触发)

    1. 获取设备属性
    udevadm monitor
    # 插入设备观察输出,或用
    udevadm info -a -n /dev/sdb
    
    1. 新建规则:/etc/udev/rules.d/99-usb-trigger.rules
    # 示例:匹配特定厂商/产品ID的USB存储
    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
      RUN+="/usr/local/bin/usb-added.sh '%k'"
    
    ACTION=="remove", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
      RUN+="/usr/local/bin/usb-removed.sh '%k'"
    
    1. 重新加载并触发
    sudo udevadm control --reload-rules
    sudo udevadm trigger
    

    说明:udev 在设备节点出现/消失时运行脚本,适合挂载、拍照设备、串口等外设自动化。

  • Cron(定时触发)

    1. 编辑当前用户任务
    crontab -e
    
    1. 示例:每天 02:00 执行
    0 2 * * * /usr/local/bin/backup.sh
    

    说明:简单可靠;复杂依赖与日志管理建议改用 systemd 定时器。

三、调试与最佳实践

  • 日志与排查
    • systemd:journalctl -u your.service -f;定时器:systemctl list-timers --all
    • inotify:将脚本输出重定向到日志文件,便于回溯
    • udev:udevadm monitor 实时观察事件;脚本尽量轻量、快速返回
  • 权限与安全
    • 将脚本放到受控目录(如 /usr/local/bin),设置可执行权限;避免在 udev RUN 中执行需要交互的命令
    • 需要特权操作时,优先由 systemd 服务以特定用户运行,或使用 Polkit 授权
  • 触发稳定性
    • 避免在 udev 中执行长时间阻塞任务;必要时通过 systemd-run 将任务移交后台服务
    • 路径单元适合“轻触发”,复杂业务在触发后交由服务完成

以上方案覆盖了时间、文件、设备三大类常见触发源,并给出可复制的最小配置与调试方法。按你的具体事件源选择其一或组合使用即可。

0