无法在启动时自动运行包含通知发送 (notify-send) 的 bash 脚本

无法在启动时自动运行包含通知发送 (notify-send) 的 bash 脚本

我正在使用 Linux Mint Cinnamon 19。我写了一个简单的脚本

   #!/bin/bash
   #test
   notify-send "text" "other text" -i dialog-warning

在执行时通知我。为了在启动时运行脚本,我尝试了以下步骤。但都不起作用。

第一的使用 init.d 目录

  1. 制作了一个简单的 bash 脚本 prova.sh,并使用 chmod 命令使其可启动。
  2. 复制到 /etc/init.d/ 目录。
  3. 建立了到 /etc/rc0.d/ 目录的软链接。

第二使用 crontab

  1. 执行命令 crontab -e。
  2. 在文件中添加以下行:@reboot /home/user/prova.sh
  3. 执行命令 update-rc.d cron defaults

有什么建议吗?

答案1

notify-send用途D-总线

通常,当您登录到桌面并使用时notify-send,变量DBUS_SESSION_BUS_ADDRESS位于您的环境中并指向正确的套接字(例如,在我的 Kubuntu 中,变量的值是unix:path=/run/user/1000/bus1000的 UID)。套接字是在您首次登录时创建的。

为了notify-send按预期工作,必须满足以下条件:

  1. 该工具通过环境变量正确定位了 socked DBUS_SESSION_BUS_ADDRESS。似乎如果未设置变量,则该工具将尝试$XDG_RUNTIME_DIR/bus
  2. 获取的套接字存在并且可以访问。
  3. 该工具由正确的用户运行(D-Bus 检查调用进程和会话守护进程的 UID 是否相同)。
  4. 还有另一个程序正在为正确的用户运行,用于接收消息并实际显示通知。

当从 调用您的脚本时/etc/init.d/,它将以 root 身份运行。我认为没有变量、没有套接字,也没有针对 root 的通知程序。

当从您的个人 crontab 调用该脚本时,它会在您的用户下运行,但未设置变量。

解决此问题的一种方法是在脚本之前添加以下几行notify-send

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
export DBUS_SESSION_BUS_ADDRESS

(一般说明:用于env | grep ^DBUS_SESSION_BUS_ADDRESS=验证您的操作系统是否使用此模式)。

然后你想以你的用户身份运行该脚本运行时登录notify-send(因此套接字存在)登录到您的桌面(这样您的桌面环境就会接收并显示通知)。Sole notify-send(如您的示例所示)肯定会在您登录之前运行;来自它的消息将被丢弃。

但如果脚本执行了一些需要时间的实际工作,那么notify-send最后还是有意义的。但即使在这种情况下,您可能登录得太晚而无法收到通知。


了解脚本是否已完成的更好方法是记录到文件:

# in the script
log="$HOME/prova.status.log"
echo "PID $$ started: $(date)" >"$log"
# real task here
# ...
echo "finished: $(date)" >>"$log"

如果同时运行多个实例,则效果会不太好;但每次重启时只运行一个实例,所以应该没问题。用作notify-send次要的、不太可靠但方便的渠道。无论您登录多晚,您都可以随时检查文件并知道您是否已经错过了通知或通知尚未到来。

相关内容