systemd服务不执行notify-send

时间:2018-04-02 09:21:30

标签: python linux systemd notify-send

我想在我的python脚本中为某些事件生成弹出窗口。我正在使用' notify-send'为此目的。

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

上面的命令在终端上执行正常,但是当我从systemd-service运行它时,它不会生成任何弹出窗口。当我看到日志时没有错误。

不知道该怎么做。请帮助。

3 个答案:

答案 0 :(得分:0)

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

Writing a systemd service that depends on XOrg中详细介绍了此问题。

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

答案 1 :(得分:0)

您需要首先设置环境变量,以便根可以与当前登录的用户通信并在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”命令来显示通知。

现在,环境参数正在发挥所有作用。

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

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

因此您可以尝试一下。

请让我知道您的情况是否有效。

答案 2 :(得分: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