Ja, richtig. Hab beim Dokumentieren das Leerzeichen verschluckt.
Beiträge von WilliamSpiderWeb
-
-
Funktioniert jetzt. Allerdings nicht als User Unit, sonder normale System Unit.
Ich weiß allerdings nicht, was ich großartig anders gemacht habe.
Ich schreibe dann mal nieder, was ich gemacht habe, damit das Thema auch einen Abschluss hat.
Installiert habe ich das Raspbian Stretch Lite vom 13.11.2018.
Grundeinstellungen vorgenommen:
Localisation Options
- Change Local --> de_DE.UTF-8
- Change Timezone --> Berlin
- Change WiFi-Country --> German
Change User Passwort
Interfacing Options
- SSH --> Enable
Advanced Options
- Expand Filesystem
- Memory Split --> 64
Update
Finish
Einmal neustarten
Per SSH eingeloggt.
Betriebssystem aktualisiert:
FTP-Server installieren:
Mqtt Broker installieren
Paketinstaller für Python installiert
System von heruntergeladenen Paketen wieder befreit:
Benötigte Python Pakete installiert:
System Unit schreiben:
Inhalt der Unit:
Code[Unit] Description=Autostart meiner ControlPi Scripte After=network-online.target [Service] Type=simple ExecStart=/usr/bin/python3 /home/pi/control_scripts/autostart.py [Install] WantedBy=multi-user.target
Unit "scharf" schalten:
Schreibzugriffe auf SD-Karte minimieren:
Ergänzung in der fstab:
Swapping deaktivieren
Codesudo dphys-swapfile swapoff sudo systemctl disable dphys-swapfile sudo apt-get purge dphys-swapfile
Nach einem Neustart hat alles wie gewünscht funktioniert. Nach der gesamten Prozedur habe ich ein System, das übers Netzwerk mittels MQTT mit meinem Smart-Home-Server kommunizieren kann, GPIOs schaltet und auf GPIOs reagiert. Und es sollte möglichst unempfindlich gegen plötzlichem Spannungsabfall sein.
Ich hoffe, ich habe nichts vergessen zu dokumentieren, was ich noch selbst prüfen werde.
Und ich hoffe, dass ich nirgends Quatsch erzählt habe...
Vielen Dank für die geduldige Hilfe. Ohne Euch wäre ich sicher nicht zu einer Lösung gekommen. Auch wenn ich nicht verstanden habe, wo nun letztendlich mein Fehler lag.
Viele Grüße,
Alex
-
Habe meine SD-Karte neu aufgesetzt mit dem Raspbian Stretch.
Allerdings hat sich am Fehlerbild nichts geändert.
Hat noch jemand eine Idee, bevor den Kram in die Tonne werfe?
-
Ich hab grad keine überzähligen SD-Karten mehr zu Hause. Ich bestell mir jetzt Neue, flashe sie mit dem aktuellsten Raspbian Stretch lite und werde das dann schrittweise nochmal aufbauen. Irgendwo muss ich ja nen Fehler gemacht haben.
Werde mein hoffentlich positiveren Ergebnisse dann hier posten.
-
Was ich bei Deiner letzten Nachricht nicht so richtig realisiert hatte... Hast Du die Unit mit meinem Script ausprobiert oder mit irgendeinem?
-
Nach Reboot und Statusabfrage bleibt's bei "inactive (dead)"
-
pi@ControlPiArbeiten:~ $ systemctl show --property Environment
Environment=LANG=de_DE.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-
Hätte ich auch selbst drauf kommen können.
Ja, ohne sudo lässt sich die Unit disablen.
Die Ergebnisse der Statusabfragen bleiben aber unverändert.
-
Das disablen klappt nicht
Codepi@ControlPiArbeiten:~ $ sudo systemctl disable myscript.service Failed to disable unit: No such file or directory
Hatte die Service-Unit ja auch in den Userbereich verschoben. Kann ich aber komischerweise auch nicht disablen.
Codepi@ControlPiArbeiten:~ $ sudo systemctl --user disable myscript.service Failed to connect to bus: Datei oder Verzeichnis nicht gefunden
Wie erwartet kommt beim Status dann auch nicht viel positives raus.
Code
Alles anzeigenpi@ControlPiArbeiten:~ $ systemctl status myscript.service Unit myscript.service could not be found. pi@ControlPiArbeiten:~ $ systemctl --user status myscript.service ● myscript.service - Autostart meiner ControlPi Scripte Loaded: loaded (/etc/systemd/user/myscript.service; enabled; vendor preset: enabled) Active: inactive (dead) pi@ControlPiArbeiten:~ $ systemctl status myscript.timer ● myscript.timer - Startet meine ControlPi-Scripte Loaded: loaded (/etc/systemd/system/myscript.timer; enabled; vendor preset: enabled) Active: inactive (dead) Feb 21 22:15:37 ControlPiArbeiten systemd[1]: myscript.timer: Refusing to start, unit to trigger not loaded. Feb 21 22:15:37 ControlPiArbeiten systemd[1]: Failed to start Startet meine ControlPi-Scripte.
Das ist schon ein bischen fies.
Hab ich mein System mittlerweile so weit zerschossen, dass ich besser von vorne anfange?
-
Scheinbar bin ich nicht beschaffen für Systemd Units.
Bin beim Erstellen der Timer-Unit nach der genannten Ubuntu-Anleitung vorgegangen.
Der Pfad wundert mich ein wenig, Hätte hier auch den Pfad /etc/systemd/user/ als den Richtigen erwartet.
Der Inhalt der myscript.timer ist:
Code[Unit] Description=Startet meine ControlPi-Scripte [Timer] OnBootSec=1min Unit=myscript.service [Install] WantedBy=multi-user.target
Anschließend Fehlermeldung beim Starten...
Codepi@ControlPiArbeiten:/etc/systemd/system $ sudo systemctl enable myscript.timer pi@ControlPiArbeiten:/etc/systemd/system $ sudo systemctl start myscript.timer Job for myscript.timer failed. See "systemctl status myscript.timer" and "journalctl -xe" for details.
Die Statusabfrage zeigt folgende Fehler...
Codepi@ControlPiArbeiten:/etc/systemd/system $ systemctl status myscript.timer ● myscript.timer - Startet meine ControlPi-Scripte Loaded: loaded (/etc/systemd/system/myscript.timer; enabled; vendor preset: enabled) Active: inactive (dead) Feb 21 16:17:03 ControlPiArbeiten systemd[1]: myscript.timer: Refusing to start, unit to trigger not loaded. Feb 21 16:17:03 ControlPiArbeiten systemd[1]: Failed to start Startet meine ControlPi-Scripte.
-
Ich wüsste jetzt nicht, welche Umgebungsvariablen...
Den Autologin für den User pi habe ich unter "sudo raspi-config" Punkt 3 (Boot Options) eingerichtet.
Das RemainAfterExit macht leider keinen Unterschied.
Die Timer-Unit hab ich noch nicht hinbekommen... Dazu melde ich mich heute Abend noch einmal.
-
Code
pi@ControlPiArbeiten:~ $ systemctl is-enabled myscript.service Failed to get unit file state for myscript.service: No such file or directory pi@ControlPiArbeiten:~ $ systemctl --user is-enabled myscript.service enabled
Umgebungsvariablen habe ich in meinen Scripts nicht verwendet.
Und User Units ohne Anmeldung starten habe ich hierüber aktiviert. Zumindest habe ich den Absatz so verstanden, dass das darüber gemacht wird.
-
Folgendes habe ich nun eingerichtet.
Codesudo mv /lib/systemd/system/myscript.service /etc/systemd/user/myscript.service systemctl --user enable myscript.service sudo loginctl enable-linger pi
Der Test ohne Reboot
Codepi@ControlPiArbeiten:~ $ systemctl --user start myscript.service pi@ControlPiArbeiten:~ $ systemctl --user status myscript.service ● myscript.service - Autostart meiner ControlPi Scripte Loaded: loaded (/etc/systemd/user/myscript.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2019-02-21 10:47:59 CET; 1min 8s ago Main PID: 696 (python3) CGroup: /user.slice/user-1000.slice/user@1000.service/myscript.service └─696 /usr/bin/python3 /home/pi/control_scripts/autostart.py Feb 21 10:47:59 ControlPiArbeiten systemd[540]: Started Autostart meiner ControlPi Scripte.
Der Test mit Reboot
Codepi@ControlPiArbeiten:~ $ systemctl --user status myscript.service ● myscript.service - Autostart meiner ControlPi Scripte Loaded: loaded (/etc/systemd/user/myscript.service; enabled; vendor preset: enabled) Active: inactive (dead)
Das sieht doch schon einmal vielversprechend aus.
Das Starten über die Unit funktioniert, aber die Unit scheint beim Reboot (noch) nicht aktiviert zu werden.
-
-
Bekomme die Fehlermeldung in beiden Fällen. Sowohl beim Starten der Unit durch den Bootvorgang als auch Beim Starten der Unit über "systemctl start".
-
Meine Scripte laufen nun unter Python 3.
Dazu waren ein paar Modifikationen in meinen Scripten nötig, sowie ein paar Nachinstallationen.
Es läuft also nun beim Direktstart mit
Starte ich das Script über die Unit, kommt trotzdem der Event-Fehler
Zitatpi@ControlPiArbeiten:~ $ systemctl status myscript.service
● myscript.service - Autostart meiner ControlPi Scripte
Loaded: loaded (/lib/systemd/system/myscript.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2019-02-21 00:11:27 CET; 2min 55s ago
Process: 548 ExecStart=/usr/bin/python3 /home/pi/control_scripts/autostart.py (code=exited, status=1/FAILURE)
Main PID: 548 (code=exited, status=1/FAILURE)
Feb 21 00:11:27 ControlPiArbeiten python3[548]: File "/home/pi/control_scripts/autostart.py", line 18, in <module>
Feb 21 00:11:27 ControlPiArbeiten python3[548]: from RoomConfig import MqttBrokerConfig as BrokerCfg
Feb 21 00:11:27 ControlPiArbeiten python3[548]: File "/home/pi/control_scripts/RoomConfig.py", line 13, in <module>
Feb 21 00:11:27 ControlPiArbeiten python3[548]: from SmartHomeItem import SmartHomeItem as shi
Feb 21 00:11:27 ControlPiArbeiten python3[548]: File "/home/pi/control_scripts/SmartHomeItem.py", line 15, in <module>
Feb 21 00:11:27 ControlPiArbeiten python3[548]: from events import Events
Feb 21 00:11:27 ControlPiArbeiten python3[548]: ImportError: No module named 'events'
Feb 21 00:11:27 ControlPiArbeiten systemd[1]: myscript.service: Main process exited, code=exited, status=1/FAILURE
Feb 21 00:11:27 ControlPiArbeiten systemd[1]: myscript.service: Unit entered failed state.
Feb 21 00:11:27 ControlPiArbeiten systemd[1]: myscript.service: Failed with result 'exit-code'.
Hmm...
-
Beim "Type=simple" ist das "RemainAfterExit" nicht erforderlich und dass das "graphical.target" sinnvoll sein soll, wenn Du keine Desktop-Version benutzt (d. h. keine grafische Anmeldung statt findet), hat niemand behauptet.
Dann bin ich ja beruhigt.
Eine Korrektur zu meiner Aussage (#33) muss ich noch tätigen. Das Beschriebene war das Ergebnis meiner Script-Version, in der ich Testweise die Events auskommentiert hatte. Hatte ich übersehen.
Verwende ich das Script, in dem das Event-Modul nicht auskommentiert ist, schlägt das Starten des Scriptes über die Unit fehl.
Python
Alles anzeigenpi@ControlPiArbeiten:~ $ systemctl status myscript.service ● myscript.service - Autostart meiner ControlPi Scripte Loaded: loaded (/lib/systemd/system/myscript.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2019-02-20 22:33:33 CET; 1min 21s ago Process: 500 ExecStart=/usr/bin/python /home/pi/autostart.py (code=exited, status=1/FAILURE) Main PID: 500 (code=exited, status=1/FAILURE) Feb 20 22:33:33 ControlPiArbeiten python[500]: File "/home/pi/autostart.py", line 18, in <module> Feb 20 22:33:33 ControlPiArbeiten python[500]: from RoomConfig import MqttBrokerConfig as BrokerCfg Feb 20 22:33:33 ControlPiArbeiten python[500]: File "/home/pi/RoomConfig.py", line 13, in <module> Feb 20 22:33:33 ControlPiArbeiten python[500]: from SmartHomeItem import SmartHomeItem as shi Feb 20 22:33:33 ControlPiArbeiten python[500]: File "/home/pi/SmartHomeItem.py", line 15, in <module> Feb 20 22:33:33 ControlPiArbeiten python[500]: from events import Events Feb 20 22:33:33 ControlPiArbeiten python[500]: ImportError: No module named events Feb 20 22:33:33 ControlPiArbeiten systemd[1]: myscript.service: Main process exited, code=exited, status=1/FAILURE Feb 20 22:33:33 ControlPiArbeiten systemd[1]: myscript.service: Unit entered failed state. Feb 20 22:33:33 ControlPiArbeiten systemd[1]: myscript.service: Failed with result 'exit-code'.
Also was sagen die Experten?
Muss ich mein Script auf Python3 umschreiben, obwohl der Direktstart mit Python 2.7 ja funktioniert?
Oder ist einfach noch irgendetwas nicht geladen, was von dem Event-Modul benötigt wird?
-
mit "WantedBy=multi-user.target" funktioniert es genau so.
Entscheidend scheint also "After=dhcpcd.target" gewesen zu sein.
-
Gestern hab ich mir mal einen freien Abend genommen. Heute wird weitergebastelt.
Meine Unit sieht nun so aus.
Code[Unit] Description=Autostart meiner ControlPi Scripte After=network-online.target dhcpcd.service [Service] Type=simple ExecStart=/usr/bin/python /home/pi/autostart.py [Install] WantedBy=graphical.target
Kein "RemainAfterExit" mehr und ich habe noch nicht verstanden, warum "graphical.target" sinnvoll ist, obwohl ich keine Desktop-Version verwende.
Trotzdem sieht's nach dem Reboot des Pis so aus.
Codepi@ControlPiArbeiten:~ $ systemctl status myscript.service ● myscript.service - Autostart meiner ControlPi Scripte Loaded: loaded (/lib/systemd/system/myscript.service; enabled; vendor preset: Active: active (running) since Wed 2019-02-20 22:05:32 CET; 3min 18s ago Main PID: 498 (python) CGroup: /system.slice/myscript.service └─498 /usr/bin/python /home/pi/autostart.py Feb 20 22:05:32 ControlPiArbeiten systemd[1]: Started Autostart meiner ControlPi
Und das Script läuft tatsächlich. Es reagiert auf Kommandos über Mqtt.
Einzig "Events" werden immer noch nicht geworfen.
Dazu noch eine Idee?
-
Habe die Installation von events wie in Beitrag #18 beschrieben durchgeführt, würde aber heute Abend mal nach angesprochenen Konfigurationen suchen.
Okay, werde ich heute Abend testen.
Ich benutze nicht die Desktop-Umgebung von Raspbian. Mein Pi bleibt in der Konsolenumgebung. Was soll denn das "graphical.target" bewirken?