ModemManager를 사용하여 SMS 메시지를 읽는 bash 스크립트를 작성했습니다 mmcli
. 대부분 명령줄에서는 제대로 작동하지만 시스템 서비스로 시작할 때는 작동하지 않습니다.
나는 이 줄이 문제의 핵심이라는 것을 빨리 발견했습니다.
/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를 확인했습니다. 루트로 실행해도 도움이 되지 않습니다.
명령줄과 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
인지에 대한 질문이 남아 있습니다.