温馨提示×

如何自定义Ubuntu Trigger通知

小樊
37
2025-12-10 02:16:44
栏目: 智能运维

在 Ubuntu 中,自定义“触发器→通知”通常有三种可靠路径:定时触发、文件事件触发、系统服务触发。下面给出可直接复制落地的做法与排错要点。


一、前置准备

  • 安装桌面通知工具:sudo apt-get install libnotify-bin(提供 notify-send)。
  • 基本用法示例:notify-send “标题” “内容” -i /path/icon.png -t 5000(图标与显示时长,单位毫秒)。
  • 若要在非交互环境(如 cron、systemd)发送通知,需显式设置 DISPLAYXAUTHORITY,例如:
    export DISPLAY=:0.0
    export XAUTHORITY=/home/你的用户名/.Xauthority
    然后使用 sudo -u 你的用户名 /usr/bin/notify-send “标题” “内容”。

二、方案一 定时触发通知(cron + notify-send)

  • 编辑当前用户的计划任务:crontab -e。
  • 示例(工作日 10:30 提醒):
    30 10 * * 1-5 /usr/bin/notify-send “工作提醒” “该开周会了” -i /usr/share/icons/hicolor/48x48/apps/calendar.png -t 10000
  • 示例(每 30 分钟提醒一次):
    */30 * * * * /usr/bin/notify-send “休息一下” “活动下肩颈” -t 5000
  • 如需在系统级 cron(root)中触发到你的桌面会话,务必在命令前导出 DISPLAY/XAUTHORITY 并以你的用户身份执行 notify-send(见上节)。
  • 说明:crontab 时间格式为 分 时 日 月 周 命令;可用 */n 表示间隔。

三、方案二 文件或目录事件触发通知(inotifywait)

  • 安装监控工具:sudo apt-get install inotify-tools
  • 监控日志新增内容并弹窗提醒(示例脚本):
    #!/usr/bin/env bash
    LOG=“/var/log/syslog”
    ICON=“/usr/share/icons/hicolor/48x48/apps/system-software-update.png”
    while inotifywait -q -e modify “$LOG”; do
    /usr/bin/notify-send “日志变更” “检测到 $LOG 有更新” -i “$ICON” -t 3000
    done
  • 后台运行:chmod +x watch.sh && nohup ./watch.sh &
  • 说明:-m 持续监听,-e modify 关注修改事件;可按需改为 create、delete 等事件。

四、方案三 系统事件触发通知(systemd 服务 + 定时器)

  • 场景A:系统启动后发送通知

    1. 创建服务:sudo vim /etc/systemd/system/notify-startup.service
      [Unit]
      Description=Notify on startup
      After=graphical.target

    [Service]
    Type=oneshot
    ExecStart=/usr/bin/notify-send “系统已启动” “欢迎回来” -i /usr/share/icons/hicolor/48x48/apps/computer.png -t 5000
    User=你的用户名
    Environment=DISPLAY=:0.0
    Environment=XAUTHORITY=/home/你的用户名/.Xauthority

    1. 启用:sudo systemctl enable notify-startup.service
  • 场景B:按日历时间触发(systemd timer)

    1. 创建定时器:sudo vim /etc/systemd/system/daily-remind.timer
      [Unit]
      Description=Daily reminder at 09:00

    [Timer]
    OnCalendar=--* 09:00:00
    Unit=daily-remind.service

    [Install]
    WantedBy=timers.target

    1. 创建服务:sudo vim /etc/systemd/system/daily-remind.service
      [Unit]
      Description=Daily reminder
      [Service]
      Type=oneshot
      ExecStart=/usr/bin/notify-send “每日提醒” “记得提交日报” -i /usr/share/icons/hicolor/48x48/apps/office-calendar.png -t 7000
      User=你的用户名
      Environment=DISPLAY=:0.0
      Environment=XAUTHORITY=/home/你的用户名/.Xauthority

    2. 启用:sudo systemctl daemon-reload && sudo systemctl enable --now daily-remind.timer

  • 说明:Timer 的 OnCalendar 语法支持精确到秒的时间;服务需指定运行用户与图形会话环境变量,才能在桌面显示通知。


五、常见问题与实用建议

  • 看不到通知
    • 确认通知程序为 notify-send,且已安装 libnotify-bin
    • 非交互环境必须设置 DISPLAYXAUTHORITY,并以目标桌面用户身份执行。
    • 某些桌面/会话(如 Wayland、远程 SSH)可能限制通知,优先在本机图形会话测试。
  • 图标不显示
    • 使用绝对路径,常见路径如 /usr/share/icons/hicolor/,或应用自带图标目录。
  • 定时不准或错过执行
    • cron 的最小粒度为分钟;如需秒级或复杂调度,用 systemd timer
  • 日志与调试
    • cron:将标准输出/错误重定向到日志文件便于排查。
    • systemd:使用 journalctl -u 服务名 查看执行记录。
  • 安全建议
    • 避免在 root 的 crontab 中直接调用 GUI 程序;如必须,务必通过 sudo -u 指定目标用户并导出会话变量。

0