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
に関する質問が残っています。