O serviço systemd personalizado falha com o resultado 'signal' status = 1 / HUP

0

Eu tenho um script Python que reinicia um modem GSM abrindo seu arquivo de porta serial / dev / ttyUSBx, enviando um comando AT de desligamento, aguardando uma resposta e aguardando o desligamento do modem pelo monitoramento do desaparecimento do Depois disso, os pinos GPIO são usados para desligar fisicamente o modem e ligá-lo novamente.

O script funciona bem quando executado de forma independente. Eu tentei então usar o systemd para transformá-lo em um serviço comum como segue:

[Unit]
Description=Modem Restart Service

[Service]
Type=oneshot
ExecStart=/usr/bin/env python3 modem-restart.py

[Install]
WantedBy=multi-user.target

No entanto, ao tentar iniciar o serviço, ele sempre falha com o seguinte erro:

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'.

Alguém pode explicar qual é a causa do erro?

    
por Amr Bekhit 02.04.2018 / 10:23

1 resposta

0

Após uma investigação mais aprofundada, o problema parece derivar do fato de que o programa tem um identificador de arquivo aberto para o arquivo de dispositivo da porta serial quando o modem desconecta da porta USB 1 . Meu palpite é que o kernel envia SIGHUP para informar ao programa da desconexão. Isso é bem tratado pelo Python sem erros e o programa é executado sem qualquer problema quando executado normalmente. No entanto, parece que o systemd intercepta o sinal SIGHUP e o trata como uma falha, matando o programa. Modificar o programa para funcionar de forma diferente ignorou o problema.

1: O motivo para manter o identificador de arquivo aberto é que, depois de enviar o comando de desligamento, o programa aguarda até que o modem envie uma mensagem indicando que ele foi totalmente desligado. Infelizmente, o modem desconecta-se do USB imediatamente após o envio da mensagem, o que não dá tempo suficiente para que o programa analise a resposta e, em seguida, feche o identificador de arquivo.

    
por 03.04.2018 / 10:25