Autostart eines Programms

  • Hallo,

    ich mache irgend etwas falsch :s

    Auf dem Desktop habe ich ein kleines Pythonprogramm abgelegt.
    In der rc.local habe ich vor der exit 0 Zeile folgendes hinterlegt:

    /Desktop/Testprogramm.py

    Leider passiert nix.

    Und gleich noch eine Frage:

    Bekomme ich das Programm (wenn es mal läuft) dazu in einem Terminal zu öffnen und die print Ausgaben auszugeben?
    Ich logge mich über einen anderen PC als root User ein.

  • Hallo Düsentrieb,

    die gleiche Frage hatten wir vorgestern schon einmal.

    Da Deine Suchmaschine nicht funktioniert, hier der Link.

    Dann bezweifle ich, dass es den Pfad

    Code
    /Desktop/Testprogramm.py


    gibt.

    Was ist denn die Ausgabe von

    Code
    ls /Desktop

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (15. Oktober 2017 um 22:07)

  • FAQ => Nützliche Links / Linksammlung => Autostart => LXDE

    Wenn du über die Desktop Oberfläche möchtest das sich ein Terminal öffnet und du die Print Ausgaben siehst, musst du explizit "lxterminal" starten und dem das Script übergeben. Denn sonst läuft das Script wie üblich im Hintergrund. Ansonsten musst du Ausgaben in eine Datei umleiten oder in Python zB "logging" verwenden....

  • Hallo,

    als alter Windows User muss ich mich erst ein wenig umstellen.
    Ich habe es jetzt geschafft das Programm automatisch mit dem Hochfahren zu starten. Habe es unter etc/xdg/Autostart abgelegt. Läuft!!!!
    Was ichjetzt noch nicht verstanden habe ist wie ich das "lxterminal" da mit einbauen muss?

  • Hallo Düsentrieb,

    statt Deines Python-Skriptes startest Du [font="Courier New"]lxterminal[/font] per Autostart.

    Und diesem [font="Courier New"]lxterminal[/font] übergibst Du als Parameter den Pfad auf Dein Python-Skript.

    Welcher Parameter das ist, verrät Dir:

    Code
    man lxterminal

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • oh je! Als Windos User sind das völlig böhmige Dörfer.
    Kannst du mir da bitte noch weiterhelfen

    in rc.local habe ich im Moment den Pad wie folgt hinterlegt:
    /etc/xdg/autostart/Testprogramm.py

    Dorthin muss jetzt das Lxterminal. Aber mit welchem Pfad und wie muss ich dann den Link zum Testprogramm da einbauen?

    Vielen Dank für deine Hilfe!

  • Hallo Düsentrieb,

    statt

    Code
    /etc/xdg/autostart/Testprogramm.py


    in rc.local
    nimmst Du

    Code
    /Pfad/zu/lxterminal

    Den Pfad erhältst Du durch

    Code
    which lxterminal

    Durch - das sagte ich bereits:

    Code
    man lxterminal


    erfährst Du, welchen Parameter Du [font="Courier New"]lxterminal[/font] übergeben musst, damit [font="Courier New"]lxterminal[/font] beim Autostart selber ein anderes Programm startet, wo auf dem Bildschirm und wie groß das Fenster für [font="Courier New"]lxterminal[/font] sein soll, welcher Zeichensatz und welche Zeichengröße und welche Zeichenfarbe und welche Hintergrundfarbe verwendet werden sollen, welche Kopfzeile das [font="Courier New"]lxterminal[/font]-Fenster erhalten soll, etc.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (20. August 2016 um 23:51)

  • Lies doch mal den Beitrag den ich oben verlinkt habe (Linksammlung).

    Wenn du die Desktopoberfläche nutzt und dafür ein Programm/Script automatisch starten möchtest dann darfst du nicht /etc/rc.local verwenden da das Script (/etc/rc.local) viel früher ausgeführt wird als die Desktop Oberfläche. Setzt dein Programm LXDE o.ä. voraus, muss es auch erst dann starten wenn LXDE bereits gestartet wurde - diese Abhängigkeit scheint bei dir ebenfalls gegeben zu sein, beziehungsweise legst du die ja selber fest.

    Wenn du dann auch noch innerhalb der Desktop Oberfläche möchtest das sich ein Terminal öffnet und darin dein Script ausgeführt wird, dann musst du erst das Terminal Programm 'lxterminal' starten und diesem Programm dann sagen dass es dein Script ausführen soll. Wie das wiederum geht kannst du über die "manual page" für lxterminal nachlesen - für nahezu jedes Programm/Befehl gibt es eine "manual page"...
    Es gibt für/von lxterminal ein bestimmtes Parameter "--command=" mit dessen Hilfe du dem Programm sagen kannst welchen Befehl es bei Start direkt ausführen soll.

    Was du also machen musst ist:

    1) Einer der letzten zwei Möglichkeiten von " FAQ => Nützliche Links / Linksammlung => Autostart => LXDE " nutzen.
    2) Den auszuführenden Befehl entsprechend setzen:

    Code
    lxterminal --command="python /home/pi/Desktop/Testprogramm.py"


    oder:

    Code
    lxterminal -e "python /home/pi/Desktop/Testprogramm.py"

    (ist im Prinzip das gleiche, siehe man page)

  • Hallo meigrafd,

    erst mal Danke für deine Unterstützung und Geduld!
    Die Aussagen aus deiner Hlfe und den 4 Vorschläge des Links waren/sind für mich etwas wiedersprüchlich.

    Du schreibst ich darf die /etc/rc.local nicht nutzen da sie schon ausgeführt wird wenn das Desktop noch gar nicht da ist.
    Genau das wird aber dann unter dem 4 Vorschlag vorgesehenDer 3. Vorschlag scheidet aus da er ja die Anmeldung eines Benutzers vorsieht.

    Ich habe nun also in der /etc/rc.local den Eintrag

    Code
    /usr/bin/lxterminal &

    eingefügt. Ist vermutliuch falsch :huh:

    In der /etx/xdg/lxsession/LXDE/autostart habe ich den Eintrag

    Code
    @lxterminal -e "python /etc/xdg/autostart/Testprogramm.py

    eingefügt.

    Da nicht mal das Fenster öffnet, liegt vermutlich da schon der Fehler. Was habe ich jetzt falsch verstanden?
    Oder liegt es auch an den m.E. fehlenden Parametern für Fenstergröße etc. Wie ich die da reinnehmen muss habe ich allerdings auch noch nichjt begriffen :wallbash: :wallbash:

    Einmal editiert, zuletzt von Düsentrieb (21. August 2016 um 10:28)


  • erst mal Danke für deine Unterstützung und Geduld!
    Die Aussagen aus deiner Hlfe und den 4 Vorschläge des Links waren/sind für mich etwas wiedersprüchlich.

    Du schreibst ich darf die /etc/rc.local nicht nutzen da sie schon ausgeführt wird wenn das Desktop noch gar nicht da ist.
    Genau das wird aber dann unter dem 4 Vorschlag vorgesehen
    Der 3. Vorschlag scheidet aus da er ja die Anmeldung eines Benutzers vorsieht.

    :s

    Die 3. Möglichkeit bezieht sich auf " Über das LXDE-Profil des jeweiligen Benutzers ( ~/.config/autostart/ ) " ... Was hat das mit /etc/rc.local zu tun? :-/
    Ja das funktioniert nur wenn sich der Benutzer anmeldet. Nein das hat nichts mit /etc/rc.local zu tun, nicht mal ansatzweise.

    Die 4.Möglichkeit bezieht sich auf " Ein spezieller Eintrag der globalen Session: /etc/xdg/lxsession/LXDE/autostart " .... Auch das hat nichts mit /etc/rc.local zu tun.


    Stell dir LXDE als ein Programm mit vielen Bereichen vor. Wenn das Programm startet werden davon auch noch andere Sachen gestartet. Erst wird ein Window-Manager gestartet, dann wird ein Session-Manager gestartet usw. Irgendwo da wird dann auch die 3. und 4. Möglichkeit abgearbeitet. Zu dem Zeitpunkt läuft LXDE also quasi bereits. /etc/rc.local wurde aber viel viel viel viel früher ausgeführt als LXDE überhaupt angefangen wurde ausgeführt zu werden..



    In der /etx/xdg/lxsession/LXDE/autostart habe ich den Eintrag

    Code
    @lxterminal -e "python /etc/xdg/autostart/Testprogramm.py

    eingefügt.

    Da nicht mal das Fenster öffnet, liegt vermutlich da schon der Fehler. Was habe ich jetzt falsch verstanden?
    Oder liegt es auch an den m.E. fehlenden Parametern für Fenstergröße etc. Wie ich die da reinnehmen muss habe ich allerdings auch noch nichjt begriffen :wallbash: :wallbash:

    Learning by Doing ;)

    Dann lies mal ab => hier <=

  • Ich steh leider immer noch auf dem Schlauch. Seuftz....

    Dein Link bezieht sich doch auch wieder auf eine Variante bei der sich pi anmelden muss.
    Mein Raspberry wird im fernen Keller stehen und soll dort die Heizung steuern.
    Ich möchte mich lediglich ab und an mal dort aus der ferne anmelden und sehen ob er noch läuft und was da so im Terminal läuft.

    Ich habe verstanden dass das Lxterminal erst gestartet werden kann wenn der bootvorgang abgeschlossen ist.
    Deshalb müsste eine ergänzte Zeile

    Code
    @lxterminal -e Fullscreen "python /etc/xdg/autostart/Testprogramm.py

    doch ausreichen da das Terminal doch auch erst nach dem Booten gestartet wird.

    Jetzt sollte das Programm nach jedem Reboot (z.B. nach Stromausfall) starten.
    Wenn ich mich jetzt über meinen Windows PC als root User anmelde sollte dort ein offenes Terminal erscheinen in dem das Programm gerade läuft.

    Wenn ich das jetzt richtig verstanden habe müsste der Fehler nur noch in der kleinen Zeile zu suchen sein da ich mir bei deren Syntax nicht sicher bin :rolleyes:

    Einmal editiert, zuletzt von Düsentrieb (21. August 2016 um 13:12)

  • Es wäre hilfreich gewesen von Anfang An dein genaues Vorhaben zu beschreiben - bitte gewöhnt euch das an, wir können nicht in euren Kopf gucken und sofort verstehen was ihr eigentlich vor habt.


    Du möchtest also eine Unabhängige Möglichkeit ein Script automatisch zu starten.... Unabhängig von der Desktop Umgebung.
    Das Script erzeugt gewisse Ausgaben die du nach dem starten nachlesen möchtest....

    3 Möglichkeiten:

    1)
    Du startest ein sog. virtual Terminal wie zum Beispiel 'screen' oder 'tmux'. Innerhalb dieses virtuellen Terminals startest du dann dein Script und kannst zu dieser Session dann bei bedarf "attachen" und siehst dann halt die Ausgaben in Echtzeit...

    Beispiel:

    Spoiler anzeigen
    Code
    screen -dmS steuerung /path/to/script.sh

    "steuerung" ist der Session-Name
    Oder

    Code
    screen -dmS steuerung /bin/bash /path/to/script.sh

    Ich finde aber tmux besser :fies:

    Code
    tmux new-session -s steuerung -d
    tmux send -t steuerung "/path/to/script.sh"
    tmux send -t steuerung ENTER

    Wenn man dann die Session ohne zu attachen steuern möchte macht man:

    Code
    tmux select-window -t "steuerung"
    # send CTRL+C key and "exit" to the current prog...
    tmux send-keys C-c;
    tmux send-keys \"exit\"
    tmux send-keys Enter

    ..gut, das ist ein bisschen umständlicher als mit screen, aber die Möglichkeiten sind umfassender bzw eigentlich auch durch "send-keys" einfacher.

    Bei 'screen' sähe das so aus bzw da weiß ich grad selbst nicht wie man CTRL+C senden kann daher ein anderes Beispiel...:

    Code
    screen -S steuerung -X stuff $'ls -l\n' #konsolen Befehl
    
    
    screen -S steuerung -X quit #screen Befehl

    ...usw...


    Und zu der tmux Session attached man dann so:

    Code
    tmux attach -t "steuerung"


    2)
    Du führst das Script so aus das alle Ausgaben in eine Datei umgeleitet werden.
    Eine solche Umleitung sähe dann zum Beispiel so aus:

    Code
    /path/to/script.sh >/path/to/logfile.log 2>&1

    1 = stdout
    2 = stderr

    Es wird also stderr auf den selben Kanal wie stdout umgeleitet und der standard Kanal stdout wird nach /path/to/logfile.log umgeleitet. Bei jedem Start wird das Logfile zurückgesetzt ( durch die einfache > )
    Mehr zum Thema Umleitung kannst du hier nachlesen: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

    Das hätte allerdings einen Nachteil und zwar die möglicherweise rasant steigende Dateigröße sowie die steigende Belastung des Mediums (ständiges schreiben). Man müsste also ggf in den Scripts auch eine Überprüfung der Dateigrösse von der Umleitung einbauen sodass das Logfile ab einer bestimmten Größe (am Ende des Scripts) gelöscht wird.. Ausserdem sollte man den Speicherort der Logfiles in ein tmpfs legen damit diese im RAM lägen und keine Schreibzugriffe auf der SD erzeugen da diese nicht unendlich viele verträgt (schont also das Systemlaufwerk).


    3)
    Du nutzt innerhalb des Scripts ein Module namens "logging" sodass das Script sich selbst darum kümmert was und wohin protokolliert werden soll. Das wäre insbesondere im Bezug auf Python die beste Wahl
    Siehe dazu:
    https://docs.python.org/2/howto/loggin…gging-to-a-file
    https://thefoxisthenewowl.blogspot.de/2016/05/python…l-beispiel.html


    Wenn du eine Datei in quasi Echtzeit überwachen möchtest, also eine Logdatei, und sofort sehen willst sobald eine neue Zeile hinzugefügt wurde, dann nutze den Befehl:

    Code
    tail -f /path/to/file.log
  • Sorry, dass ich mein Geheimnis über die Verwendung so lange für mich behalten habe.
    -- Aber immerhin habe ich (und vielleicht auch ein paar andere) so wieder etwas gelernt - Danke!!!

    Wenn es also nicht möglich ist das Terminal automatisch auf jedem Desktop zu starten, gibt es dann vielleicht die Möglichkeit aus Windows direkt einen "screen" zu öffnen und das Programm auf dem Raspberry zu sehen?


  • Wenn es also nicht möglich ist das Terminal automatisch auf jedem Desktop zu starten, gibt es dann vielleicht die Möglichkeit aus Windows direkt einen "screen" zu öffnen und das Programm auf dem Raspberry zu sehen?

    *seufz*

    'screen' ist nur eine der drei Möglichkeiten - wieso möchtest du die anderen 2 nicht in Betracht ziehen? :-/

    Du brauchst von Windows aus kein screen starten. Dein Script läuft in einem screen und wenn Du die Ausgaben betrachten willst musst du dich zu dieser screen-session verbinden... Aber wie gesagt, bitte ziehe die anderen beiden Möglichkeiten in Betracht!


    PS: Wie kommst du eigentlich auf "@lxterminal -e Fullscreen "python /etc/xdg/autostart/Testprogramm.py" :s Völliges Chaos und du liest anscheint nicht das was man dir schreibt.

  • doch doch!
    Ich habe alles gelesen.
    Das "Chaos in der Programmzeile kam nur durch die vielen Versuche da ich im Kopf hatte dass ich das Terminalfenster in einer definierten Größe darstellen muss. Egal, Schnee von gestern.

    Die beiden anderen Lösungen habe ich schon auch in Erwägung gezogen, wollte mich aber zunächst auf die eine "Live" Lösung beschränken.

    Vielleicht ahben wir an dem einen Punkt aneienander vorbei geschreiben.
    Ich gehe über Windows und xrdp auf den Raspberry. Der screen läuft dann nur auf dem Raspberry.
    Meine Frage war ob ich von Windows aus auch anders auf den "screen" komme oder den Umweg über xrdp nutzen muss


  • doch doch!
    Ich habe alles gelesen.
    Das "Chaos in der Programmzeile kam nur durch die vielen Versuche da ich im Kopf hatte dass ich das Terminalfenster in einer definierten Größe darstellen muss. Egal, Schnee von gestern.

    Wenn das deine bisherigen Versuche waren, darfst du dich nicht wundern wenn es nicht funktioniert. Wir nannten dir auch schon die manual-Page zu lesen, auch das hast du anscheint nicht denn dann sollte klar sein das "-e Fullscreen" nicht funktionieren kann ...

    Die beiden anderen Lösungen habe ich schon auch in Erwägung gezogen, wollte mich aber zunächst auf die eine "Live" Lösung beschränken.

    Vielleicht ahben wir an dem einen Punkt aneienander vorbei geschreiben.
    Ich gehe über Windows und xrdp auf den Raspberry. Der screen läuft dann nur auf dem Raspberry.
    Meine Frage war ob ich von Windows aus auch anders auf den "screen" komme oder den Umweg über xrdp nutzen muss

    Sofern dein Python Programm selbst keine GUI erzeugt, ist auch kein LXDE erforderlich.

    Du startest ein screen und darüber dein Script. Dann verbindest du dich via SSH und attachst zu der Session.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!