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
相关产品推荐
相关产品推荐

