Systemctl não pode iniciar o serviço que usa a porta ttyACM0 após a reinicialização

Systemctl não pode iniciar o serviço que usa a porta ttyACM0 após a reinicialização

Preciso iniciar meu próprio serviço (cliente SignalR) escrito em C# (.NET6) depois que a porta ttyACM0 estiver disponível. Este serviço deve ser iniciado após outro serviço (Servidor SignalR).

O serviço do servidor inicia normalmente após a reinicialização (sem qualquer problema). O status do serviço ao cliente fornece informações:

● RfidHwSigRClient.service
Loaded: loaded (/etc/systemd/system/RfidHwSigRClient.service;
disabled; vendor preset: enabled)    Active: inactive (dead) since Mon
2023-03-06 22:20:58 CET; 2min 17s ago   Process: 1583
ExecStart=/usr/bin/dotnet
/home/predator/Projects/VSLinuxDbg/RfidHwSigRClient/RfidHwSigRClient.dll
(code=exited, status=0/SUCCESS)   Process: 767 ExecStartPre=/bin/sleep
10 (code=exited, status=0/SUCCESS)  Main PID: 1583 (code=exited,
status=0/SUCCESS)

Mar 06 22:20:46 PredatorClient systemd[1]: Starting
RfidHwSigRClient.service... Mar 06 22:20:57 PredatorClient
dotnet[1583]: Microsoft.Hosting.Lifetime[0] Application started.
Hosting environment: Production; Content root path: / Mar 06 22:20:57
PredatorClient systemd[1]: Started RfidHwSigRClient.service. Mar 06
22:20:58 PredatorClient dotnet[1583]:
Microsoft.Extensions.Hosting.Internal.Host[9] BackgroundService failed
System.UnauthorizedAccessException: Access to the port '/dev/usb_rfid'
is denied.  ---> System.IO.IOException: Device or resource busy    ---
End of inner exception stack trace ---    at
System.IO.Ports.SafeSerialDeviceHandle.Open(String portName)    at
System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate,
Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout,
Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean
rtsEnable, Boolean discardNull, Byte parityReplace)    at
System.IO.Ports.SerialPort.Open()    at
Predator.Hardware.RfIDCard.RfId.Connect() in
D:\Projects\PredatorDotNet\Source\PredatorClientDotNet\Hardware\RFIDCard\RfId.cs:line
159    at
Predator.SignalRComm.RfidHwSigRClient.RfidBroker.ConnectAsync() in
D:\Projects\PredatorDotNet\Source\PredatorClientDotNet\SignalRComm\Derived\RfidHwSigRClient\RfidHwSigRClient\RfidBroker.cs:line
95    at
Predator.SignalRComm.RfidHwSigRClient.RfidBroker.ExecuteAsync(CancellationToken
stoppingToken) in
D:\Projects\PredatorDotNet\Source\PredatorClientDotNet\SignalRComm\Derived\RfidHwSigRClient\RfidHwSigRClient\RfidBroker.cs:line
77    at
Microsoft.Extensions.Hosting.Internal.Host.TryExecuteBackgroundServiceAsync(BackgroundService
backgroundService) Mar 06 22:20:58 PredatorClient dotnet[1583]:
Microsoft.Extensions.Hosting.Internal.Host[10] The
HostOptions.BackgroundServiceExceptionBehavior is configured to
StopHost. A BackgroundService has thrown an unhandled exception, and
the IHost instance is stopping. To avoid this behavior, configure this
to Ignore; however the BackgroundService will not be restarted.
System.UnauthorizedAccessException: Access to the port '/dev/usb_rfid'
is denied.  ---> System.IO.IOException: Device or resource busy    ---
End of inner exception stack trace ---    at
System.IO.Ports.SafeSerialDeviceHandle.Open(String portName)    at
System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate,
Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout,
Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean
rtsEnable, Boolean discardNull, Byte parityReplace)    at
System.IO.Ports.SerialPort.Open()    at
Predator.Hardware.RfIDCard.RfId.Connect() in
D:\Projects\PredatorDotNet\Source\PredatorClientDotNet\Hardware\RFIDCard\RfId.cs:line
159    at
Predator.SignalRComm.RfidHwSigRClient.RfidBroker.ConnectAsync() in
D:\Projects\PredatorDotNet\Source\PredatorClientDotNet\SignalRComm\Derived\RfidHwSigRClient\RfidHwSigRClient\RfidBroker.cs:line
95    at
Predator.SignalRComm.RfidHwSigRClient.RfidBroker.ExecuteAsync(CancellationToken
stoppingToken) in
D:\Projects\PredatorDotNet\Source\PredatorClientDotNet\SignalRComm\Derived\RfidHwSigRClient\RfidHwSigRClient\RfidBroker.cs:line
77    at
Microsoft.Extensions.Hosting.Internal.Host.TryExecuteBackgroundServiceAsync(BackgroundService
backgroundService) Mar 06 22:20:58 PredatorClient dotnet[1583]:
Microsoft.Hosting.Lifetime[0] Application is shutting down...

O problema é que a porta não está disponível.

Assim que o Ubuntu for iniciado, posso reiniciar o serviço do cliente ( systemctl restart service_name) na linha de comando e o serviço funciona corretamente (porto está pronto).

Eu li vários fóruns sobre como iniciar o serviço. Infelizmente, sem sucesso.

Minhas regras do udev são assim:

KERNEL=="ttyACM*", ATTRS{manufacturer}=="MOD elektronik*", ATTRS{product}=="MOD RFID reader", MODE="0666", SYMLINK+="usb_rfid", ENV{SYSTEMD_WANTS}+="RfidHwSigRClient.service"

Meu RfidHwSigRClient.service se parece com:

[unit]
Description=RFId Card Reader SignalR Client Service
BindsTo=dev-usb_rfid.device
Requires=MainSigRServer.service
After=dev-usb_rfid.device MainSigRserver.service
StartLimitIntervalSec=300
StartLimitBurst=30

[Service]
User=predator
Group=predator
Type=notify
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/dotnet /home/predator/Projects/VSLinuxDbg/RfidHwSigRClient/RfidHwSigRClient.dll
TimeoutStartSec=30s
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-use

Também verifiquei para iniciar o serviço 10 segundos depois ( ExecStartPre=/bin/sleep 10) sem sucesso. O usuário predador pertence à discagem do grupo. O Ubuntu é 18.04 LTS.

Por favor, alguém sabe o que estou fazendo de errado? Obrigado. R.

Responder1

Eu tive que usar sleep aprox. por 15s para iniciar o atendimento ao cliente. Se o sono for 10s. a porta não está pronta (acesso negado). Porém, ainda não sei iniciar o serviço do cliente assim que a porta e o serviço do servidor estiverem prontos.

Minha temperatura. a configuração de RfidHwSigRClient.service é a seguinte:

[Unit]
Description=RFId Card Reader SignalR Client Service
BindsTo=dev-usb_rfid.device
After=dev-usb_rfid.device MainSigRServer.service
StartLimitIntervalSec=300
StartLimitBurst=30

[Service]
Type=notify
ExecStartPre=/bin/sleep 15
ExecStart=/usr/bin/dotnet /home/predator/Projects/VSLinuxDbg/RfidHwSigRClient/RfidHwSigRClient.dll
Restart=on-failure
RestartSec=5s
User=predator
Group=predator

[Install]
WantedBy=dev-usb_rfid.device

A regra Udev 99-usb-serial.rules é:

KERNEL=="ttyACM*", ATTRS{manufacturer}=="MOD elektronik*", ATTRS{product}=="MOD RFID reader", SYMLINK+="usb_rfid", MODE="0666", ACTION=="add", RUN+="/home/predator/Projects/Scripts/rfid_plugged.sh", TAG+="systemd" ENV{SYSTEMD_WANTS}+="MainSigRServer.service"

Obrigado..

informação relacionada