/dev/ttyUSBx 직렬 포트 파일을 열고, 종료 AT 명령을 보내고, 응답을 기다린 다음 직렬 포트 파일이 사라지는지 모니터링하여 모뎀이 종료될 때까지 기다리는 방식으로 GSM 모뎀을 재부팅하는 Python 스크립트가 있습니다. 나중에 GPIO 핀을 물리적으로 껐다가 다시 켜는 데 사용됩니다.
스크립트는 독립 실행형으로 실행될 때 제대로 작동합니다. 그런 다음 systemd를 사용하여 다음과 같은 일회용 서비스로 전환해 보았습니다.
[Unit]
Description=Modem Restart Service
[Service]
Type=oneshot
ExecStart=/usr/bin/env python3 modem-restart.py
[Install]
WantedBy=multi-user.target
그러나 서비스를 시작하려고 하면 항상 다음 오류와 함께 실패합니다.
Apr 02 09:34:21 test-system systemd[1]: Starting Modem Restart Service...
-- Subject: Unit RestartModem.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit RestartModem.service has begun starting up. Apr 02 09:34:22 test-system InternetMonitor.exe[5601]: INFO:root:Sending shutdown command to modem... Apr 02 09:34:36 test-system systemd[1]: RestartModem.service: Main process exited, code=killed, status=1/HUP Apr 02 09:34:36 test-system systemd[1]: Failed to start Modem Restart Service.
-- Subject: Unit RestartModem.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit RestartModem.service has failed.
--
-- The result is failed. Apr 02 09:34:36 test-system systemd[1]: RestartModem.service: Unit entered failed state. Apr 02 09:34:36 test-system systemd[1]: RestartModem.service: Failed with result 'signal'.
누구든지 오류의 원인을 설명할 수 있습니까?
답변1
추가 조사 결과 모뎀이 USB 포트 1 에서 연결이 끊어졌을 때 프로그램에 직렬 포트 장치 파일에 대한 열린 파일 핸들이 있다는 사실에서 문제가 발생한 것으로 보입니다 . 내 생각엔 커널이 프로그램에 연결 해제를 알리기 위해 SIGHUP을 보내는 것 같습니다. Python은 오류 없이 잘 처리했으며 프로그램은 문제 없이 정상적으로 실행되었습니다. 그러나 systemd는 SIGHUP 신호를 가로채서 이를 실패로 처리하여 프로그램을 종료시키는 것 같습니다. 다르게 작동하도록 프로그램을 수정하면 이 문제를 피할 수 있습니다.
1:파일 핸들을 열어 두는 이유는 프로그램이 닫기 명령을 보낸 후 모뎀이 완전히 닫혔다는 메시지를 보낼 때까지 기다리기 때문입니다. 불행히도 모뎀은 메시지를 보낸 후 즉시 USB 연결을 끊기 때문에 프로그램이 응답을 구문 분석한 다음 파일 핸들을 닫을 충분한 시간을 제공하지 못합니다.