在 Ubuntu 中,自定义“触发器→通知”通常有三种可靠路径:定时触发、文件事件触发、系统服务触发。下面给出可直接复制落地的做法与排错要点。
一、前置准备
- 安装桌面通知工具:sudo apt-get install libnotify-bin(提供 notify-send)。
- 基本用法示例:notify-send “标题” “内容” -i /path/icon.png -t 5000(图标与显示时长,单位毫秒)。
- 若要在非交互环境(如 cron、systemd)发送通知,需显式设置 DISPLAY 与 XAUTHORITY,例如:
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:系统启动后发送通知
- 创建服务: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
- 启用:sudo systemctl enable notify-startup.service
-
场景B:按日历时间触发(systemd timer)
- 创建定时器: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
-
创建服务: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
-
启用:sudo systemctl daemon-reload && sudo systemctl enable --now daily-remind.timer
-
说明:Timer 的 OnCalendar 语法支持精确到秒的时间;服务需指定运行用户与图形会话环境变量,才能在桌面显示通知。
五、常见问题与实用建议
- 看不到通知
- 确认通知程序为 notify-send,且已安装 libnotify-bin。
- 非交互环境必须设置 DISPLAY 与 XAUTHORITY,并以目标桌面用户身份执行。
- 某些桌面/会话(如 Wayland、远程 SSH)可能限制通知,优先在本机图形会话测试。
- 图标不显示
- 使用绝对路径,常见路径如 /usr/share/icons/hicolor/,或应用自带图标目录。
- 定时不准或错过执行
- cron 的最小粒度为分钟;如需秒级或复杂调度,用 systemd timer。
- 日志与调试
- cron:将标准输出/错误重定向到日志文件便于排查。
- systemd:使用 journalctl -u 服务名 查看执行记录。
- 安全建议
- 避免在 root 的 crontab 中直接调用 GUI 程序;如必须,务必通过 sudo -u 指定目标用户并导出会话变量。