Dバス監視はコマンドラインで機能しますが、システムサービスでは機能しません。

Dバス監視はコマンドラインで機能しますが、システムサービスでは機能しません。

ModemManagerを使用してSMSメッセージを読み取るbashスクリプトを作成しましたmmcli。ほとんどの場合、コマンドラインでは正常に動作しますが、システムサービスで起動すると機能しません。

私はこの行が問題の核心であることをすぐに見つけました。

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

コマンドラインから起動すると、USBモデムはSMSメッセージを受信するたびに1行を印刷します。これが私が期待したものであり、私に必要なものです。

出力例(注釈付き):

# 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同じ2行を出力することから始めます。監視というのですが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='...'")

ただし、rootユーザーとしてのみ可能です。これはD-Busセキュリティポリシーで説明できるようです。

使用法の違いを引き起こす原因が何であるかgdbusに関する質問が残っています。

関連情報