D-bus 监控确实可以从命令行运行,但不能作为 systemd 服务运行

D-bus 监控确实可以从命令行运行,但不能作为 systemd 服务运行

我编写了一个使用 ModemManager 读取 SMS 消息的 bash 脚本,主要使用mmcli.它在命令行中工作正常,但在作为 systemd 服务启动时则不然。

我很快发现这一行是问题的核心:

/usr/bin/gdbus monitor --system --dest org.freedesktop.ModemManager1

当我从命令行启动它时,每次 USB 调制解调器收到 SMS 消息时,它都会打印一行。这是我所期望的,也是我所需要的。

输出示例(已注释):

# at the start
Monitoring signals from all objects owned by org.freedesktop.ModemManager1
The name org.freedesktop.ModemManager1 is owned by :1.5

# when a message arrives
/org/freedesktop/ModemManager1/Modem/0: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.ModemManager1.Modem.Messaging', {'Messages': <[objectpath '/org/freedesktop/ModemManager1/SMS/19']>}, @as [])
/org/freedesktop/ModemManager1/Modem/0: org.freedesktop.ModemManager1.Modem.Messaging.Added (objectpath '/org/freedesktop/ModemManager1/SMS/19', true)

添加服务文件后,当我启动与 systemd 服务相同的脚本时,它不会执行相同的操作。gdbus开始时仅输出相同的两行,仅此而已。说gdbus是监控,其实不然。短信不断传入,但仍然未被注意到。

我检查了服务正在运行,脚本正在运行,gdbus正在运行,相同的用户 ID。以 root 身份运行也没有帮助。

命令行和 systemd 有什么区别?我该如何解决它?


服务文件 - 没什么特别的

[Unit]
Description=Read incoming SMS messages
After=network-online.target

[Service]
Type=exec
User=smsuser
Environment=LANG=en_US.UTF-8
ExecStart=/bin/bash /opt/sms/sms_read_service ModemNameArg
Restart=on-failure

[Install]
WantedBy=multi-user.target

更新:

我让它工作:

# shortened for brevity
busctl --system monitor ... --match type='signal',interface='...',member='...'")

但只能作为根用户。我认为这可以用 D-Bus 安全策略来解释。

问题 - 是什么导致了使用时的差异gdbus- 仍然存在。

相关内容