カスタム systemd サービスが失敗しました。結果「信号」ステータス = 1/HUP

カスタム systemd サービスが失敗しました。結果「信号」ステータス = 1/HUP

/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接続を切断するため、プログラムは応答を解析してファイルハンドルを閉じるのに十分な時間を提供しません。

関連情報