我编写了一个使用 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
- 仍然存在。