Ich möchte meinen aktuellen Stand zusammenfassen:
In file:///etc/sysconfig/gpsd fehlt die Definition von DEVICE=/dev/ttyACM0
Diese Variable wird NUR beim Start über service ausgewertet, nicht beim Start über uDev.
Die Variable GPSD_PORT wird dagegen NUR beim Start über uDev ausgewertet, nicht beim Start über service.
Der uDev-Start funktioniert nur wenn der Parameter GPSD_STARTBYUDEV="yes" auf yes gesetzt ist.
Dem service ist der Wert dieses Parameters bei meinen Tests egal gewesen.
In file:///usr/lib/systemd/system/gpsd.service muss diese Zeile auskommentiert werden:
#Requires=gpsd.socket
Soweit ich sah wird der weiter unten dort sichtbare Parameter OPTIONS in keiner Konfigurationsdatei gesetzt.
Aufgrund eines Programmierfehlers im Daemon /usr/sbin/gpsd funktioniert das Binden an eine lokale IPv6-Adresse nicht.
Interaktiv wird eine Fehlermeldung geworfen, wo sie nicht stört. Beim Start mit beiden Diensten ( service und uDev ) führt das zum Abbruch des Startvorganges.
Das kann derzeit vermieden werden, wenn in file:///etc/sysconfig/gpsd mindestens die Option GPSD_OPTIONS="-G" enthält.
In der Datei file:///usr/lib/udev/rules.d/51-gpsd.rules musste ich für meine Zwecke die folgende Zeile einfügen:
KERNEL=="ttyACM*", ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a7", RUN="gpsd.sh"
Alle anderen Zeilen dieser Datei verwenden ATTR statt ATTRS. Ich kann mir nicht vorstellen, dass dies dann trotzdem funktioniert, wenn es bei meiner Definition ungeeignet war.
In der Datei file:///usr/lib/udev/gpsd.sh verstehe ich noch immer nicht unter welchen Voraussetzungen dieser Pfad verfügbar ist file:///dev/tcp/localhost/$GPSD_PORT.
Entsprechend habe ich diese viert-letzte Zeile auskommentiert. Auch wenn ich den Sinn noch nicht verstanden habe, könnte an dieser Stelle folgende Zeile helfen:
(sleep 1 && echo "F=$TTYDEV" | telnet localhost $GPSD_PORT & (je nach Zweck dieser Übung kann statt telnet auch netcat / nc eingesetzt werden.)
Außerdem würde ich mir eine Auswertung der gesetzten Variable GPSD_PORT wünschen. Vorschlag: GPSD_PORT=$(echo $GPSD_PORT | awk '{print $NF+0}') .
Damit wäre zumindest sichergestellt, dass ein numerischer Wert übergeben wurde (Bei Null könnte man dies ggf noch durch den Default-Port ersetzen.)
Ich habe zudem gelernt, dass die Dateien file:///var/run/gpsd.socket, file:///var/run/gpsd.device und file:///var/run/gpsd.sock bei allen Starts erwartungsgemäß uninteressant sind.
Die letzte Datei entsteht durch den Start als service, die anderen beim Start mit uDev beim Abarbeiten von file:///usr/lib/udev/gpsd.sh .
Die Datei file:///etc/default/gpsd wird bei den vordefinierten Services referenziert, fehlt aber (sie wäre ein guter Ort für die Definition von DEVICES).
Auch die Fehlermeldungen bzgl. var--run.mount,etc. beim Starten des falsch konfigurierten Service sind falsche Fährten.
Mit den genannten Modifikationen funktioniert folgende Start-Sequenz
systemctl enable gpsd.service ; systemctl start gpsd.service
bei dem das Setzen des Ports in file:///etc/sysconfig/gpsd ignoriert wird.
Das Starten mittels uDev gelang mir bisher nicht. Ich konnte zwar beobachten, dass das korrekte Kommando aufgerufen wurde, dann aber der Start abbrach.
Interaktiv hat die von uDev generierte Kommandozeile funktioniert, nicht aber beim Einstecken, obwohl die gleiche Zeile gestartet worden war.
Ich halte es für möglich, dass der ModemManager hier seine Finger im Spiel hat. Falls dies jemand lösen könnte, wäre mir diese Art des Starts erheblich lieber.
Vielen Dank an meine Sparringspartner Sauerland und Berichtigung, die mich immer wieder in die richtige Richtung geschubst haben.
Ich würde es gerne sehen, wenn diese Erkenntnisse in das Paket einfließen könnten. Ich wäre bereit das Paket zu aktualisieren, falls dies gewünscht wird.
Leider weiß ich nicht, wie ich mich da sinnvoll einbringe.
Andersfalls müsst ihr jedes Mal hier nachlesen, welche Kleinigkeiten angepasst werden müssen.
Alles
Anders
Tipp: Wer Tippfehler findet darf sie behalten. Aber vielleicht gibt einer die fehlenden Kommata wieder zurück.