Systemctl kann nach dem Neustart keinen Dienst starten, der den Port ttyACM0 verwendet

Systemctl kann nach dem Neustart keinen Dienst starten, der den Port ttyACM0 verwendet

Ich muss meinen eigenen Dienst (SignalR-Client) starten, der in C# (.NET6) geschrieben ist, nachdem der Port ttyACM0 verfügbar ist. Dieser Dienst sollte nach anderen Diensten gestartet werden (SignalR-Server).

Der Serverdienst startet nach dem Neustart normal (ohne Probleme). Der Client-Servicestatus gibt Auskunft:

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

Das Problem ist, dass der Port nicht verfügbar ist.

Sobald Ubuntu gestartet ist, kann ich den Client-Dienst ( systemctl restart service_name) über die Befehlszeile neu starten und der Dienst funktioniert ordnungsgemäß (Hafen ist bereit).

Ich habe in mehreren Foren nachgelesen, wie man den Dienst startet. Leider ohne Erfolg.

Meine udev-Regeln sehen folgendermaßen aus:

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

Mein RfidHwSigRClient.service sieht so aus:

[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

Ich habe auch geprüft, ob der Dienst 10 Sekunden später gestartet werden soll ( ExecStartPre=/bin/sleep 10), ohne Erfolg. Der Benutzer Predator gehört zur Gruppe Dialout. Ubuntu ist 18.04 LTS.

Bitte, weiß jemand, was ich falsch mache? Danke. R.

Antwort1

Ich musste den Ruhezustand für ca. 15 Sekunden verwenden, um den Client-Dienst zu starten. Wenn der Ruhezustand 10 Sekunden dauert, ist der Port nicht bereit (Zugriff verweigert). Ich weiß jedoch immer noch nicht, wie ich den Client-Dienst starten soll, sobald sowohl der Port als auch der Server-Dienst bereit sind.

Meine temporäre Konfiguration von RfidHwSigRClient.service ist wie folgt:

[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

Die Udev-Regel 99-usb-serial.rules lautet:

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"

Danke schön..

verwandte Informationen