Ubuntu 23.10下启动脚本中rclone挂载OneDrive后notify-send无法正常发送通知的问题
嗨,我来帮你捋捋这个问题~ 这种情况基本都是自启动脚本缺少桌面会话的关键环境变量导致的:你在终端运行脚本时,它继承了当前桌面会话的完整环境,但GNOME自启动管理器跑脚本时,没有加载这些变量,notify-send没法连接到桌面的通知服务,自然就看不到弹窗了。
下面给你两个实用的解决方案:
方案一:给自启动脚本补上必要的环境变量
方法1:修改自启动.desktop文件
打开你的.config/autostart/onedrive.sh.desktop,先确认Exec行的脚本路径是不是写错了(你当前写的是test-message.sh,要对应到实际的挂载脚本),然后改成这样:
Exec=bash -c 'export DISPLAY=:0; export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus; /home/ernesto/Documents/Scripts/你的挂载脚本.sh'
这段代码会在运行脚本前,先设置DISPLAY(指定桌面显示端口)和DBUS_SESSION_BUS_ADDRESS(通知服务的通信路径)这两个核心变量,让notify-send能找到桌面通知服务。
方法2:在脚本开头添加环境变量
直接在你的bash脚本最顶部(#!/bin/bash之后)加上:
# 配置桌面会话环境变量,确保notify-send正常工作 export DISPLAY=:0 export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
这样不管脚本在哪运行,都会先把必要的环境变量配置好。
方案二:用systemd用户服务替代GNOME自启动(更稳定)
如果经常遇到自启动脚本的环境问题,推荐用systemd用户服务来管理,它会自动继承桌面会话的环境,可靠性更高:
- 创建一个服务文件:
nano ~/.config/systemd/user/onedrive-mount.service
- 粘贴以下内容(记得替换脚本路径为你实际的挂载脚本路径):
[Unit] Description=自动挂载OneDrive(rclone) After=graphical-session.target [Service] Type=simple ExecStart=/home/ernesto/Documents/Scripts/你的挂载脚本.sh Restart=on-failure RestartSec=5 [Install] WantedBy=graphical-session.target
- 保存退出后,启用并启动服务:
systemctl --user enable --now onedrive-mount.service
这个服务会在桌面会话完全启动后再运行,不仅notify-send能正常弹出通知,就算挂载失败还会自动重试,比GNOME自启动更省心。
最后别忘了检查你的日志文件(~/onedrive_mount_error_log.txt和~/script_output_log.txt),确认挂载操作本身是否真的成功——有时候挂载失败也会导致通知不显示,但根据你的描述,终端运行正常,所以核心问题还是环境变量。
备注:内容来源于stack exchange,提问作者Anima94

