Problem beim Autostart eines Programms

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
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: 17738
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
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das ganze macht doch überhaupt keinen Sinn... (stand oben glaube ich auch schon ;-) ).

Warum realisierst du das nicht als Client-Server Applikation, z.B. mit einer HTML-basierten GUI? Das wäre vielleicht / wahrscheinlich wesentlich einfacher.

Was ist überhaupt der Sinn der Übung? Was macht dein Skript und was muss der Nutzer eingeben, damit es was macht?

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

@noisefloor...bin leider nicht in der Position zu urteilen, ob das Sinn macht oder nicht. Es geht mir eigentlich nur darum, dass es funktioniert.
Sinn der Übung:
1. Kommunikation mit einem Socket-Adapter , der wiederum mit einem Produktionsleitsystem sich austauscht
2. Eingabe von Seriennummer durch den User
3. Auswertung der Seriennummer durch Funktionsaufruf und Weitergabe an das Produktionsleitsystem

weiteres: Zwischendurch noch ein paar Ausgaben auf dem LCD und paar blinkend LEDs. Fertig.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Black Panther: dort, wo Du Dein Auto-Login eingestellt hast, hast Du doch auch einen Nutzer angegeben. Wo ist das Problem, den zu ändern?

@noisefloor: Black Panther hat im anderen Thread etwas von einem Barcode-Scanner geschrieben. Dieser agiert normalerweise als ganz normale Tastatur, so dass man den Input eines Terminals braucht.
BlackJack

@noisefloor: Irgendwie hatte ich im Hinterkopf das da ein Barcode-Scanner involviert ist der sich wie eine Tastatur verhält und der am Raspi angeschlossen ist. Das heisst das Programm auf dem Raspi muss nach dem automatischen starten die ”Tastatureingaben” des Scanners entgegennehmen können.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Black Panther hat im anderen Thread etwas von einem Barcode-Scanner geschrieben.
Axo. Na dann... Sollte dann aber per RPC gehen?

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

oder um nochmal auf die Client-Server Lösung zurück zu kommen: https://serratus.github.io/quaggaJS/

Gruß, noisefloor
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: was hat denn nun RPC hier verloren? Es handelt sich um Hardware, die wahrscheinlich an einen USB-Port des Raspi angeschlossen ist und ein Terminal braucht.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
was hat denn nun RPC hier verloren?
Alternative Client-Server Lösung.
Es handelt sich um Hardware, die wahrscheinlich an einen USB-Port des Raspi angeschlossen ist und ein Terminal braucht.
Mag ja sein - aber wie soll dann der Login headless funktionieren? Auch per Barcode?

@Black Panther: klär' uns doch mal in der vollen Gesamtheit auf. Vielleicht gibt es ja wirklich eine bessere Lösung, als dass, was du gerade versuchts zu implementieren.

Gruß, noisefloor
BlackJack

@noisefloor: Der Login soll automatisch passieren. Liest doch erst mal die vorhandenen Beiträge. Darum geht es doch unter anderem die ganze Zeit.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@BlackJack: das ist schon klar. Auch, dass der Nutzer _nicht_ `pi` sein sollte. Nur hatte ich es bis dato so verstanden, dass es X andere Benutzer geben soll (und nicht nur _einen_ anderen).

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

vielen Dank erst einmal für die Mithilfe. Grundsätzlich war die .bashrc der richtige Gedanke aus meiner Sicht. Ich muss mein Programm noch etwas anpassen. Beim Bootup wurde das Programm immer gestartet, aber sofort wieder abgebrochen. Scheinbar war ein Hintergrunddienst nicht zeitnah fertig. Ab 3 Sekunden time.sleep() lief das Programm erst einmal so ab wie ich es wollte.

Problem weiterhin:
Jedesmal wenn ich mich über SSH verbinde oder ein Terminal über die GUI aufrufe läuft das Programm als erstes ab. Aus jetztiger Sicht noch nicht ganz so schlimm, könnte aber in ZUkunft nervig werden.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Black Panther: besser Du schreibst ein Exception-Handling, das auf den fehlenden Hintergrunddienst wartet, statt pauschal 3 Sekunden Pause einzubauen. Wie man einen neuen Nutzer mit alternativer Login-Shell erzeugt, habe ich ja schon geschrieben.
BlackJack

@Black Panther: Die `.bashrc` ist IMHO der falsche Platz, auch wenn der Benutzer sonst nichts weiter macht. Diese Datei wird *jedes mal* ausgeführt wenn unter dem Benutzer eine Bash gestartet wird. Sachen die nur beim Anmelden passieren sollen, also nur bei eine Login-Shell, gehören in die `.bash_profile`. Aber selbst das würde ich nicht machen. Leg einen neuen Benutzer an und verpasse dem Dein Programm *als* Login-Shell.
Black Panther
User
Beiträge: 27
Registriert: Samstag 11. Juni 2016, 19:09

@Black Jack.... die .bashrc ist wirklich kein guter Platz. *Das jedes mal* ausführen ist genau mein Problem.

@Sirius 3... ich würde auf alle deine Vorschläge gerne reagieren, aber sie bedingen auch immer ein ewig langes googeln. Bis jetzt weiß ich noch nicht einmal, welcher Dienst es ist, der mir Beschwerden macht. Desweiteren ist mir halt auch nicht klar auf welche login-shell du anspielstt. Ich muss wissen wie der konkrete Befehl dazu heißt. Ich kenne eben nur "sudo nano .bashrc" und "sudo nano /etc/profile". Bei beiden führten Einträge die ein Autologin vollziehen sollten nicht zu den gewünschten Ergebnissen. In "sudo nano ~/.login" steht bei mir z.B garnichts drin. Von dahe nehme ich an, das ich dort falsch bin.

@Sirius 3...zum Thema neuen Nutzer anlegen bin ich auch nicht ganz auf deiner Höhe:
1. Nutzer erstellen: useradd -m -s /dir/your_script.py username
2. Dann konfigurierst Du diesen User als Autologin.
Erstens verstehe ich noch. Legst ein neuen Nutzer an und das Verzeichnis, aber zweitens ist das Problem schlecht hin. DIe Tutorials im Internet beziehen sich alle darauf "sudo nano /usr/bin/raspi-config" abzuändern und "pi" gegen z.B "Black Panther" auszutauschen. Das möchte ich aber garnicht. Ich weiß was du mir sagen willst, aber ich kann es technisch nicht umsetzen.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Black Panther: welcher Fehler Dein Python-Programm abstürzen läßt, siehst Du am Traceback, den Dir Python freundlicherweise liefert.
Login-Shell ist das Programm das gestartet wird, sobald Du Dich einloggst, und da willst Du Dein Python-Programm starten und dafür willst Du einen eigenen Nutzer anlegen, und das macht useradd. BlackJack hat Dir noch den Link: Systemd Autologin without Display Manager gezeigt, wo beschrieben steht, wie man ein Auto-Login einrichtet. Was Du jetzt mit raspi-config willst, versteh ich nicht.
Antworten