3

我想为我的 python 脚本中的某些事件生成弹出窗口。我为此目的使用“通知发送”。

subprocess.Popen(['notify-send', "Authentication", "True/False"])

上面的命令在终端上执行得很好,但是当我从 systemd-service 运行它时,它不会生成任何弹出窗口。

当我看到日志时,没有错误。

4

3 回答 3

1

您需要首先设置环境变量,以便 root 可以与当前登录的用户通信并在 GUI 中发送通知。

就我而言,我这样做如下:

[Unit]
Description=< write your description>
After=systemd-user-sessions.service,systemd-journald.service

[Service]
Type=simple
ExecStart=/bin/bash /<path to your script file>.sh
Restart=always
RestartSec=1
KillMode=process
IgnoreSIGPIPE=no
RemainAfterExit=yes
Environment="DISPLAY=:0" "XAUTHORITY=/home/<User name>/.Xauthority"

[Install]
WantedBy=multi-user.target

这里,

RemainAfterExit=是

在服务文件中提及非常重要。

确保更改脚本文件的所有参数,例如描述、用户名和路径

另外,通过执行命令确保脚本文件具有可执行权限

sudo chmod +x <path to your script file>.sh

这里我的脚本文件是用 bash 编写的,它使用相同的“notify-send”命令显示通知。

现在,Environment 参数正在发挥作用。

您可以在此处阅读有关此行为和讨论的问题的更多信息。

我当然不知道这些文件的完整工作原理或它是如何工作的,但对我来说,它工作得很好。

所以你可以试一试。

请让我知道这是否适用于您的情况。

于 2020-05-14T17:08:14.620 回答
0

运行图形应用程序需要设置DISPLAY环境变量,当从 CLI 运行它时会设置该环境变量,但在运行时不需要systemd设置(除非您明确设置它)。

此问题在编写依赖于 XOrg 的 systemd 服务中有更多内容。

我同意一般建议,这systemd可能不是这项工作的最佳工具。您最好使用桌面环境的“自动启动”功能来运行您的应用程序,这将在您需要的环境中设置正确的东西。

于 2018-04-02T19:47:51.977 回答
0

如果在 cron 中为桌面通知运行 notify-send,则 notify-send 正在向 dbus 发送值。所以它需要告诉 dbus 连接到正确的总线。通过检查 DBUS_SESSION_BUS_ADDRESS 环境变量并将其设置为相同的值,可以找到该地址。

从您的运行环境中复制 DISPLAY 和 DBUS_SESSION_BUS_ADDRESS 的值并将它们设置在 [Service].Environment 部分

有关 Arch Wiki 的更多信息: https ://wiki.archlinux.org/index.php/Cron#Running_X.org_server-based_applications

于 2021-03-30T22:06:35.173 回答