You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

systemd执行notify-send报错“The connection is closed”问题排查

故障根因

报错The connection is closed和Node.js脚本逻辑无关,核心是服务部署层级错误:

  • 你把通知服务放在了系统级systemd目录/usr/lib/systemd/system/,这类服务默认以root身份运行,和普通用户的图形桌面会话完全隔离
  • 虽然硬编码了DISPLAY、XAUTHORITY、DBUS_SESSION_BUS_ADDRESS环境变量,但系统服务启动时机远早于用户桌面会话、dunst通知进程的启动时间,触发任务时用户DBUS会话要么未建立要么已断连,哪怕换成shell脚本直接调用notify-send也会报同样的错
  • 硬编码的DBUS地址/run/user/1000/bus在用户注销重登后会自动重建失效,没有长期可用性。
修复方案

所有桌面交互类(调用通知、GUI程序、xprop这类操作X11组件的)定时任务,必须用用户级systemd部署,不要用系统级服务:

  • 迁移配置文件到用户systemd目录
    执行以下命令把之前放在系统目录的service和timer文件移到当前用户的systemd配置路径,修正权限:
sudo mv /usr/lib/systemd/system/notification.service /home/rounak/.config/systemd/user/
sudo mv /usr/lib/systemd/system/notification.timer /home/rounak/.config/systemd/user/
sudo chown rounak:rounak /home/rounak/.config/systemd/user/notification.*
  • 修改notification.service配置
    去掉适配系统服务的After、Install段配置,删掉硬编码的环境变量(用户级systemd会自动继承当前桌面会话的所有图形相关环境变量),修改后内容如下:
[Unit]
Description=Show notification
Wants=notification.timer

[Service]
Type=simple
ExecStart=/usr/bin/node /home/rounak/base/scripts/get-combined-notification.js

[Install]
WantedBy=default.target
  • 重载配置并启动定时任务
    所有操作用普通用户身份执行,不要加sudo:
systemctl --user daemon-reload
systemctl --user enable --now notification.timer
  • 配置会话常驻(可选,推荐配置)
    开启用户linger后,用户未登录、注销重登场景下用户级systemd进程也会保持运行,定时任务不会中断:
sudo loginctl enable-linger rounak
验证方式
  • 手动触发服务验证通知是否正常弹出:systemctl --user start notification.service
  • 查看定时任务运行状态:systemctl --user list-timers notification.timer
  • 实时查看服务日志:journalctl --user -u notification.service -f

内容的提问来源于stack exchange,提问作者Rounak Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:36:25