Problem beim Autostart eines Programms

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

Hallo liebe Community,

ich komme gerade nicht so wirklich weiter....

Ich habe ein funktionierendes Programm auf dem Raspberry. Kennzeichnend für das Programm sind Eingaben (durch Tastatur und Scanner) und Ausgaben auf einem Display des RPI.

Ich wollte das Programm gerne in den Autostart überführen, aber irgedendwie scheitere ich da an irgendeiner Stelle. Mein Ablauf war folgender:

1. Funktionierends Skript mit Shebang Zeile am Anfang

Code: Alles auswählen

#!/usr/bin/env python
2.Rechte vergeben

Code: Alles auswählen

sudo chmod +x /home/pi/raspberrypi2_mitlcd.py
3. In rc. local etwas eingetragen

Code: Alles auswählen

sudo nano /etc/rc.local
4. und zwar folgendes

Code: Alles auswählen

#!/bin/sh -e
#
#rc.local
cd /
cd home/pi/Desktop
sudo python raspberrypi2_mitlcd.py &
exit 0
5. Abgespeichert mit Strg O und Neugestartet

Fehlerbeschreibung:
- beim Start von Raspbian geht er auf meine EInstellung garnicht ein ( steht auch insgesamt nicht da)
- eigner test mit /etc/rc.local über Terminal ergibt das er Eingaben mit bash quittiert, was ja so für mich nicht in Frage kommt


Wonach bin ich auf der Suche?

Ich möchte, das mein Programm beim Hochfahren automatisch läuft. Das Eingaben von der Tastatur wie (j=ja, n=nein) möglich sind und etwas gescannt und ausgegeben werden kann. Ich vermute das ihm beim Start und bei rc.local irgendwelche Libarys oder Zugriffe fehlen. Mein Code ist unter anderem in Python 2.7 geschrieben.


Ich hoffe ihr versteht, was ich meine.

LG

Hendrik
BlackJack

@Black Panther: Es fehlt vor allem eine Verbindung zu dem aktiven Terminal das die Tastatureingaben bekommt, und wo drin das Programm laufen müsste damit es die vom Terminal weitergeleitet bekommen würde. Du hast ein Programm welches im Vordergrund mit einem Benutzer kommunizieren soll, da ist ein systemweiter Hintergrunddienst die falsche Lösung.

Du bräuchtest eher einen normalen Benutzer für dieses Programm, der beim starten automatisch angemeldet wird, und der anstelle einer Shell, dieses Programm beim Anmelden ausführt.
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

@BlackJack... guter Ansatz, aber mir fehlt die Tiefe beim Umgang mit dem Raspberry PI. Ein Autologin bzw Autostart ist auf mehreren Wegen möglich nur klappt keiner so richtig bei mir.

Ich habe versucht mich an dieser Seite zu orientieren -> https://raspberry.tips/raspberrypi-eins ... inrichten/

Bei mir sind sämtlich Varianten mit rc.local und Aufruf von Desktop myscript.py schief gegangen. Dadurch das ich Raspbian Jessie bei meinem Raspberry Pi 2 Model B benutze habe ich auch kein Zugriff auf die "inittab" datei.

Durch Revisionen wurde das ganze wohl an eine andere Stelle gelagert. Dafür habe ich mich hier schlau gemacht:

http://www.raspberrypi-spy.co.uk/2015/1 ... g-systemd/

Ich habe mich an den Ablauf gehalten. ALs ich den Status abgerufen habe, wurde mir bewussst, das Programm auch ablief. Der Clue ist nur es wird nicht auf Benutzereingaben gewartet. Das Skript scheint nur das zu machen, was es kann ohne auf den Nutzer einzugehen (Terminalfunktionen nutzen).
Somit bin ich wieder in der gleichen Ausgangslage.

Problem bleibt weiterhin:
Skriptaufruf mit Nutzung der Terminalfunktionen.

Was bis jetzt funktioniert:
-Autologin


LG

BlackPanther
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Black Panther: wie schon BlackJack geschrieben hat, ist das Starten des Skriptes nach einem Autologin mithin die beste Möglichkeit auf Terminal-Eingaben zu reagieren. Dazu kannst Du einfach Dein Python-Skript als Shell des Autologin-Nutzers setzen
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

Hallo,

nach kurzer Unterbrechung an dem Projekt und mehreren Ansätzen bin ich immer noch nicht zu einer zufriedenstellenden Lösung gekommen.
Das Problem ist die Interaktivität mit einem Scanner oder User , sprich Terminalzugriffe. Ein Programm was lediglich auszuführende Anweisungen und Print Darstellungen hat ist nicht das Problem.

Ich habe es mit einer .bashrc probiert. Beim Bootup startet das gewünschte Programm, jedoch mein eigentliches Programm scheitert wieder an den Terminalzugriffen.

Die in den meisten Tutorials beschriebenen Vorgänge an der inittab sind auf jessie nicht vorhanden und wurden durch systemd ersetzt. Hat jemand einen genauen Hinweis oder ein Tutorial wie ich mein Programm automatisch sauber starten lassen kann?

LG

Black Panther
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Black Panther hat geschrieben:Ich habe es mit einer .bashrc probiert. Beim Bootup startet das gewünschte Programm, jedoch mein eigentliches Programm scheitert wieder an den Terminalzugriffen.
Was ist jetzt der Unterschied zwischen "gewünschten Programm" und "eigentlichem Programm"? Wenn Du in .bashrc ein Programm startest, bekommt das das Terminal und Du kannst Sachen eingeben. Was hast Du genau gemacht und was passiert und was hättest Du gerne?
BlackJack

Hilft das hier eventuell weiter? http://www.linuxsecrets.com/blog/15ques ... ay-manager

Bei so etwas immer schön merken was man da so macht, damit man es auch wieder rückgängig machen kann. Es sei denn man installiert gerne neu. ;-)
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

Vielen Dank für die schnellen Antworten.
@Sirius3 : Ich probiere es zuerst mit einem Testprogramm (enthält nur Printanweisung und Pausen) und dann mit meinem Programm (Netzwerkzugriff, Benutzereingaben werden erwartet usw.) Das Progranm funktioniert unter dem LXTerminal so wie es soll. In Zukunft will ich den Raspberry aber headless in einer Anlage betreiben (sprich ohne Monitor) und dafür muss das Programm ja irgendwie automatisch starten.

@BlackJack: bei den Vorgängen zu .bashrc und systemd Dateien hatte ich immer noch alles offen zum zurücksetzen.


Derzeitiges Vorgehen:
1. raspi-config (Boot into GUI mit automatisierter Nutzeranmeldung eingestellt)
2. sudo nano ~/.config/lxsession/LXDE-pi/autostart
3. dort in die letzte Zeile @lxterminal --command "home/pi/myscript.py" eingetragen

Mit der Absicht:
Raspberry Pi soll hochfahren den Nutzer automatisch einloggen und das Programm über LXTerminal starten.

Problem derzeit:
Raspberry fährt hoch bis zum Desktop aber dann passiert nichts. Schritt 2 und 3 aus derzeitigen Vorgehen scheinen sinnlos zu sein.

LG

Black Panther
BlackJack

@Black Panther: Ach so mit GUI. Ich ging davon aus das nur die Linux-Konsole gestartet werden sollte.

Bei ``--command "home/pi/myscript.py"`` fehlt am Anfang vor 'home' der '/', denn sonst sucht das Terminal im aktuellen Verzeichnis nach 'home/…' und nicht im Wurzelverzeichnis.

Ich vermute mal das Ausgaben, also auch Fehlerausgaben, von dem Autostart-Kram in ~/.xsession-errors landen.
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

@BlackJack.. "/" war korrekt....jetzt geht es zumindest in den LXTerminal, aber bleibt dort irgendwie hängen. Ich sehe im Prinzip nur das LXTerminal Fenster. Wenn ich auf Datei "New Window" klicke dann öffnet sich das LXTerminal Fenster mit "pi@raspberrypi ~$".


Geht das nicht direkt zu erreichen?
BlackJack

@Black Panther: Was heisst das bleibt hängen? Da läuft dann Dein Programm drin. Macht das Ausgaben und Du siehst die nicht, oder gibt das einfach nur nichts aus und wartet auf Eingaben?
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

@BlackJack.... Der Desktop erscheint und auch das LXTerminal ist offen. Das Programm läuft aber definitiv nicht darin ab. Woran mache ich das fest?
1.) Das Programm würde ich spätestens beim Anschalten des LCD´s am Raspberry bemerken.
2.) kein Log-file in /home/pi

Irgendwie habe ich das Gefühl, dass es nur das LXTerminal ist ohne das er den Befhel ausführt.

LG

Black Panther
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Black Panther: Was kommt denn statt dessen im LXTerminal? Ein Prompt? Was sagt die Prozessliste?
Baue Debugausgaben ein und schau, ob und welche ausgegeben werden.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Das Programm läuft aber definitiv nicht darin ab.
Was sagt denn `ps aux`? Siehst du das Programm in der Prozessliste? Und die Datei ist wirklich ausführbar?

Ansonsten hält das Wiki von ubuntuusers.de https://wiki.ubuntuusers.de/LXDE_Einstellungen/ eine ganze Reihe Infos zu dem Thema bereits. Gilt im Prinzip auch alles so für Raspbian, nur die Pfade sind ggf. etwas anders.

Gruß, noisefloor
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

Hallo,
bin jetzt etwas weiter..... Momentan steht im autostart (sudo nano ~/.config/lxsession/LXDE-pi/autostart) folgendes:
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@lxterminal
@xscreensaver -no-splash
@sh ${HOME}/.config/lxsession/LXDE-pi/autokey.sh
@/usr/bin/python2.7 /home/pi/Desktop/myscript.py

Ergebnis: Raspberry Pi startet die Gui ruft das Terminalfenster auf (pi@raspberrypi:~) und arbeitet anscheinend nur im Hintergrund mein Programm ab. Ich dachte es läuft im Vordergrund, so ähnlich wie bei einem normalen aufrufen aus dem Terminal her (sprich mit Ausgaben).

Fehler: Im Endeffekt braucht mein Programm auch USER Eingaben. Genau an dieser Stelle tritt in der Main ein Fehler auf.

Code: Alles auswählen

File "myscript.py", line 153, in main
seriennummer = raw_input("Geben SIe bitte eine Seriennummer ein!:")
EOF Error
Frage: Wie ist eine genauere Fehlerlokalisation möglich. Starte ich aus dem Terminal mein Programm mit sudo python myscript.py läuft alles fehlerfrei. Momentan beim geplanten headless Betrieb geht das nicht.
BlackJack

@Black Panther: Du startest da ein LXTerminal und Du startest dein Python-Programm. Das eine hat mit dem anderen rein gar nichts zu tun. Warum denkst Du denn das ausgerechnet die letzte Zeile etwas in dem Terminal ablaufen lässt, wo doch die anderen Zeilen zwischen Terminalstart und dem Start von Deinem Skript das auch nicht tun. Wie man ein Terminal *mit einem Programm darin* startet, hast Du doch weiter oben in diesem Thema schon einmal herausgefunden.

Allerdings stellt sich dann noch das Problem, dass Dein Skript zwar eine Ein- und Ausgabe hat, dass nachdem alles gestartet ist, das Terminal aber vielleicht nicht den Fokus hat, die Eingaben des Benutzers also bei einer anderen Anwendung landen.

Wenn das sowieso am Ende headless laufen soll, dann verstehe ich diese ganzen Umstände mit der GUI/Desktopumgebung nicht. Grafische Oberfläche weglassen, automatisches anmelden auf der Linux-Konsole und beim Benutzer dann statt der Login-Shell gleich das Programm starten wäre viel einfacher und direkter. Da kann deutlich weniger schief laufen. Ich würde dafür einen eigenen Benutzer anlegen, damit man sich zum Beispiel immer noch mit dem normalen Benutzer per SSH auf dem Gerät anmelden kann.
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

@BlackJack ...ich glaube dir schon, dass es nicht der elegantetste Weg ist. Wahrscheinlich ist es für den headless Betrieb auch falsch, weil es eben nicht richtig funktioniert. Der parallele Start von Diensten und die Einteilung in Dienstlevel ( 3 stellig) ist mir eh noch nicht so ganz klar.

Kannst du den Vorgang eventuell ähnlich eines Tutorials schildern. Im Endeffekt würde ich nach dieser Internetseite sonst arbeiten.
http://www.schnatterente.net/technik/ra ... -erstellen
Das Anlegen von Start Skripten ging bei mir aber schon einmal gegen den Baum. Von daher würde ich dich bitten deine Überlegung etwas auszuführen.

LG
Black Panther
BlackJack

@Black Panther: Debian Jessie benutzt kein SysV-Init mehr sondern systemd, das hatten wir doch schon mal ziemlich am Anfang des Themas. Und zu systemd und Autologin ohne GUI hatte ich doch gestern einen Link geposted.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Black Panther: das Vorgehen, das BlackJack beschreibt, hat nichts mit systemd zu tun, weil Du ja keinen Service sondern ein Interaktives Programm hast (ich glaube den Punkt hatten wir hier schon mehr als öfters). Also:
1. Nutzer erstellen: useradd -m -s /dir/your_script.py username
2. Dann konfigurierst Du diesen User als Autologin.
3. fertig
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

Hallo,

die Antworten habe ich jetzt erst einmal verarbeitet und mehr oder weniger verstanden.
Vorgang:
Zur Lösung habe ich die sudo nano .bashrc verändert. Dazu habe ich folgendes eingetragen:

Code: Alles auswählen

echo ("Start des Programms myscript.py über .bashrc")  
sudo python /home/pi/Desktop/myscript.py
-> Echo ist nur für mich die Information damit ich sehe das was passiert

Im Endeffekt funktionierte das Programm über SSH automatisch und so wie ich es mir dachte. Als ich raspi-config auf autoboot und autologin gestellt habe ist das Programm immer angelaufen, aber abgebrochen. Nach langem probieren habe ich festgestellt das es ein Zeitproblem war. Anscheinend standen nicht alle Dienste sofort zur Verfügung. Baue ich einen timesleep von 3 sekunden am Anfang ein, dann funktioniert der headless Betrieb beim Raspberry pi.

@Sirius ....jetzt komme ich zum nächsten Problem. Ich möchte nicht immer bei einer SSH Verbindung und autologin automatisch mein Programm anlaufen lassen. Dazu möchte ich den USer "pi" belassen und einen anderen Gründen. Die´ser muss natürlich auch gewisse Rechte im System haben um zumindest das Programm ausführen zu lassen. Einen User anlegen kann ich. In der .bashrc etwas anweisen kann ich auch. Derzeit habe ich noch nicht gefunden, wo ich den User als Autologin veranlassen kann. Viele Tipps im Internet zielen eher darauf ab den User "pi" zu verändern. Bitte für deinen den Punkt 2 von dir etwas aus.

LG
Hendrik
Antworten