GSM USB 모뎀을 사용하여 SMS 메시지를 보내는 다음 스크립트가 있습니다.
#!/bin/bash
env > /home/hans/systemenv.txt
#touch /home/homeassistant/pipo2.txt
read count < /home/homeassistant/.homeassistant/smsCounter.txt
stty -F /dev/ttyUSB0 9600 min 100 time 2 -hupcl brkint ignpar -opost -onlcr -isig -icanon -echo
chat TIMEOUT 1 "" "AT+CMGF=1" "OK" > /dev/ttyUSB0
chat TIMEOUT 1 "" "AT+CMGS=\"0123456789\"" "OK" > /dev/ttyUSB0
chat TIMEOUT 1 "" "$1" "OK" > /dev/ttyUSB0
chat TIMEOUT 1 "" "^Z" "OK" > /dev/ttyUSB0
#sleep 2
#chat TIMEOUT 1 "" "AT+CMGS=\"0987654321\"" "OK" > /dev/ttyUSB0
#chat TIMEOUT 1 "" "$1" "OK" > /dev/ttyUSB0
#chat TIMEOUT 1 "" "^Z" "OK" > /dev/ttyUSB0
let 'count++'
echo $count > /home/homeassistant/.homeassistant/smsCounter.txt
명령줄에서 호출하면 스크립트가 제대로 작동하지만 systemd를 사용하여 시작된 프로그램에서 호출하면 스크립트가 실제로 실행되지만 chat 명령은 실행되지 않습니다. systemd 서비스에서 실행 중인 프로그램에서 스크립트를 호출할 때 sudo Journalctl -f -xe를 실행하면 다음이 표시됩니다.
Oct 08 13:37:37 homeassistant chat[2641]: Can't get terminal parameters: Inappropriate ioctl for device
Oct 08 13:37:37 homeassistant chat[2642]: Can't get terminal parameters: Inappropriate ioctl for device
Oct 08 13:37:37 homeassistant chat[2643]: Can't get terminal parameters: Inappropriate ioctl for device
Oct 08 13:37:37 homeassistant chat[2644]: Can't get terminal parameters: Inappropriate ioctl for device
이 경우 스크립트는 Home Assistant라는 프로그램에서 호출됩니다. 홈어시스턴트는 systemd.service 스크립트에서 시작됩니다. systemd.service를 실행하는 동일한 사용자로 터미널에서 Home Assistant를 시작하면 위의 내용이 표시되지 않고 문자 메시지가 전송됩니다.
systemctl을 사용하여 시작된 다른 프로그램에서 동일한 스크립트를 호출하면 동일한 오류가 발생합니다.
답변1
이것은 systemd와는 아무 관련이 없으며 systemctl
프로그램의 기본적인 올바른 사용과 관련된 모든 것입니다 chat
.
chat
일반적으로 PPP 데몬과 함께 번들로 제공되는 프로그램입니다.이것리눅스 PPP FAQ, Al Longyear에서 관리, 적어도 1996년 이후:
17.6. 나는 도망 갔다
chat
. 로컬 단말기를 모뎀으로 사용하려는 것 같은데 모뎀과 통신이 되지 않습니다. 모뎀 이름은 어떻게 지정합니까chat
?
chat
"필터"라는 프로그램 클래스에 속합니다. 즉, 표준 입력에서 읽고 내부적으로 일부 처리를 수행한 다음 표준 출력에 씁니다.따라서 실제로 실행하여
chat
모뎀과 통신하게 하려면 표준 입력 및 출력이 모뎀으로 리디렉션되도록<
I /O 리디렉션 연산자를 사용해야 합니다.>
하지만, 당신이 사용하는
chat
경우pppd
[...]
무엇을 봐너다음을 위한 것입니다:
채팅 시간 초과 1 "" "AT+CMGF=1" "OK" > /dev/ttyUSB0
chat
표준 출력이 직렬 장치에 연결되어 있지만 표준 입력이 포함된 쉘 스크립트의 표준 입력에 연결된 프로그램을 실행 중입니다 . 대화형 로그인 세션에서 쉘 스크립트를 실행하면 이것이 터미널이 되고, 데몬의 표준 입력이 됩니다(거의 확실함).아니요터미널 문자 장치임) 데몬에서 쉘 스크립트를 실행할 때.
chat
직렬 장치와 채팅 하지 않는 것은 당연합니다 . chat
데몬에서 쉘 스크립트를 실행할 때 터미널 장치와 통신조차 하지 않는다고 불평하는 것은 당연합니다 .
그래서 올바르게 사용되었습니다 chat
.리눅스 PPP FAQ설명하다. 표준 입력 및 출력을 통신하려는 장치와 동일한 장치로 만듭니다.
chat
올바른 장치에 연결하여 사용하기 시작하면 chat
직렬 장치를 켜고 끄기 위해 이러한 여러 호출을 모두 수행하고 싶지 않을 것입니다. 다시 말하지만 이것은 systemd 또는 데몬과 관련이 없으며 공유 표준 입력 및 출력 파일 설명이 있는 셸에서 여러 연속 명령을 실행하는 메커니즘에 대한 간단한 연습입니다.
또는 실제로 수행하는 작업에 따라 전체 쉘 스크립트를 이런 방식으로 실행하여 처음에 스크립트를 호출하는 모든 프로그램에서 전체 스크립트의 표준 입력 및 출력을 적절한 장치로 리디렉션할 수도 있습니다. (이 경우 최상의 결과를 -s
얻으려면 옵션을 사용하십시오 chat
.)
답변2
(제어) 터미널이 없는 SystemD 프로세스로 인해 문제가 발생할 수 있습니다.
더 나은 해결책은 JdeBP의 답변에 설명된 대로 올바른 접근 방식을 사용하는 것이지만 chat
일반적인 경우에는...
스크립트에 다음 코드를 추가할 수 있습니다.
tty &>/dev/null || exec </dev/tty
이것은 /dev/tty
(제어) 터미널로 열립니다.
답변3
글쎄, 나는 채팅의 진짜 목적을 깨닫지 못했습니다. 방금 누군가의 블로그에서 일부 코드를 복사했습니다. 너무 많은 Linux 프로그램의 문제점은 매뉴얼 페이지가 배우는 데 몇 주가 걸리는 용어로 가득 차 있는 경우가 많다는 것입니다. 일반 사용자에게는 적합하지 않습니다.
저는 현재 스크립트에 gammu라는 프로그램을 사용하고 있습니다. 이제는 시스템 서비스에서 호출되어도 제대로 작동합니다.
답변4
왜 그렇게 신비한 방법을 사용하겠습니까? 오늘은 ModemManager에서 mmcli를 사용하여 문자 메시지를 읽고 보내세요. 바라보다https://sigquit.wordpress.com/2012/09/14/sms-goodies-in-modemmanager/