Autostart mit Systemd und Textausgabe auf Konsole (TUI) klappt nicht

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Ihr Lieben,
    ich benötige noch mal undefined.
    Ich hatte in einem anderen Thread schon Hilfe von deets und weiteren bekommen. Autostart mit Crontab klappt: Anzeige bei C-Programm geht nicht

    Zum Hintergrund. Es läuft Jessie auf einem 2b+ Raspi. Es gibt ein C-Programm welches sich auch "Autostarten" läßt. Der Haken ist die Textausgabe des Programm, die nicht erscheint. Das ist verständlich, dass nicht jedes Autostart Programm Text auspucken soll. Mein Programm soll aber TEXT ANZEIGENm und tut es nicht.
    Grafik-Bildschirm wollte ich verzichten, da ich es einfach liebe... :huh: Einfach war es bis hier her nicht.
    Nach dem Tipp von Deets habe ich mir hier viele Infos geholt:
    http://unix.stackexchange.com/questions/3182…gram-after-boot
    http://unix.stackexchange.com/questions/3182…gram-after-boot
    oder hier
    http://unix.stackexchange.com/questions/3182…gram-after-boot

    Ich habe verstanden, dess ich die normale Console (getty oder agetty) nicht benötige und das stattdess mein Programm gestartet werden soll. Die Ausgabe soll das "einfach" zunächst als Lauftext (später evtl. mit ncurses) auf dem Bildschirm (bei mir Composite) auf Mini-Analog-TV erfolgen.

    Folgendes habe ich nun getan:

    Code
    sudo nano  /etc/systemd/system/my-terminal-ui@.service

    aktivieren meiner Routine, ich dachte mir auf tyy1, weil diese beim Starten gezeigt wird. und hier dann automatisch die Mess-Werte stehen sollen

    Code
    sudo systemctl enable my-terminal-ui@.tty1-service
    Code
    Created symlink from /etc/systemd/system/multi-user.target.wants/my-terminal-ui@tty1-service.service to /etc/systemd/system/my-terminal-ui@.service.

    das Skript welches dann aufgerufen wird /usr/local/sbin/autostart-Regelung ist lauffähig und ich habe es Probe gestartet.

    Beim neuen Systemstart versuchte der Raspi die Skipt zu starten, es kam aber "failed".

    folgende Ausführung gibt mir leider auch keine Klarheit:

    Code
    systemctl status my-terminal-ui@tty1-service.service
    ● my-terminal-ui@tty1-service.service - Custom user interface on tty1/service
      Loaded: loaded (/etc/systemd/system/my-terminal-ui@.service; enabled)
      Active: failed (Result: start-limit) since So 2016-11-20 23:00:55 UTC; 1min 41s ago
        Docs: http://unix.stackexchange.com/a/318336/5132
     Process: 506 ExecStart=/usr/local/sbin/autostart-Regelung (code=exited, status=208/STDIN)
    Main PID: 506 (code=exited, status=208/STDIN)
    Speicherzugriffsfehler


    VLC-Player mit Systemd starten
    Der Thread ist auch interessant und hilfreich, aber ohne Text-Ausgabe, die ich mir ja wünsche...

    wenn ich meine Routine einmalig starte mit

    Code
    sudo systemctl start my-terminal-ui@tty1-service.service


    kommt keine Anzeige, auch kein Fehler wird gemeldet.

    WAS kann ich tun.??? :helpnew: :helpnew: :@

  • Autostart mit Systemd und Textausgabe auf Konsole (TUI) klappt nicht? Schau mal ob du hier fündig wirst!

  • ich benötige noch mal undefined ... ? :-/ Ich benötige auch undefined :lol:


    Zum Hintergrund. Es läuft Jessie auf einem 2b+ Raspi. Es gibt ein C-Programm welches sich auch "Autostarten" läßt. Der Haken ist die Textausgabe des Programm, die nicht erscheint. Das ist verständlich, dass nicht jedes Autostart Programm Text auspucken soll. Mein Programm soll aber TEXT ANZEIGENm und tut es nicht.

    Blöde Frage: Wohin soll der Text denn ausgegeben werden?


    PS: Bitte fix deine Links.

  • meigrafd: auf das erste Terminal.

    Wasserratte: das sieht ja erstmal so aus, als ob dein Programm nicht will. Um das mal zu entkoppeln, also dein Setup von dem eigentlichen Programm, wuerde ich dir vorschlagen ein einfaches Testskript zu schreiben, das du ausfuehrbar machst & das periodisch Ausgaben macht - aus dem Kopf (ungetestet!)

    Bash
    #!/bin/bash
     while [ true ] ; do echo hallo ; sleep 1 ; done

    Und dieses Skript führst du statt deinem Programm aus. Wenn das klappt, weisst du, das dein Setup steht, und kannst dich auf Fehlersuche im Programm machen.


  • Auf dem Bildschirm (!!!)(Composite-Ausgang) soll ein Messwert ausgegeben werden. - Am C-Programm liegt es nicht. Ursache sind getty oder autostart

    Ja das war mir schon irgendwie kla. Allerdings schreibst du im zweiten Satz: Grafik-Bildschirm wollte ich verzichten

    Also was ist für Dich der Unterschied zwischen Bildschirm am Composite und einem Grafik-Bildschirm ? :s


    Was du nun aber auch selber genannt hast: tty

    Was passiert wenn du dich anmeldest? Es wird eine individuelle/eigene/uniq tty für den Benutzer erzeugt.

    Aber was ist mit Diensten / Programme die automatisch gestartet werden? Welche TTY haben die? Oder haben die überhaupt eine TTY?

    Ist an den Pi ein Bildschirm angeschlossen?
    Soll die Ausgabe direkt dort erfolgen?
    Soll sich ein Benutzer automatisch anmelden und dort dann die Ausgabe deines Programms zu sehen sein?
    Was für eine Ausgabe ist das? Reiner Text?

  • Müsste das nicht

    Code
    sudo systemctl enable my-terminal-ui@tty1.service

    heißen?

    ja stimmt. Den "." vor Service hatte ich erst nicht gesehen. Nun habe ich das geändert. Und gerade mal getestet.

    Code
    sudo systemctl start my-terminal-ui@tty1.service

    #
    führt jetzt zu folgendem Ergebniss: Die Ausgabe tty1 wir gelöscht und es erscheint ca. 3 x ein neuer Anmeldebildschirm...
    Was soll mir das sagen??

  • 1)
    ich wollte nur sagen, dass ich kein HDMI-Angeschlossen habe

    Was passiert wenn du dich anmeldest? Es wird eine individuelle/eigene/uniq tty für den Benutzer erzeugt.
    2) z.Z. ist autolog-In noch aktiv, es passiert nichts besonderes, bzw. s. unter die Ergänzung im nä. Text-Feld von Manul

    3)

    Aber was ist mit Diensten / Programme die automatisch gestartet werden? Welche TTY haben die? Oder haben die überhaupt eine TTY?
    genau das weiß ich nicht. alles was ich zuvor mal mit Crontab probiert habe habe ich auskommentiert. Die Lösung suche ich ja gerade
    4)

    Ist an den Pi ein Bildschirm angeschlossen? --> ja über COmposite
    5) Soll die Ausgabe direkt dort erfolgen? --> ja genau (würde ich so auber nicht wiede rmachen)


    6) Soll sich ein Benutzer automatisch anmelden und dort dann die Ausgabe deines Programms zu sehen sein? --> genau so :angel:


    7) Was für eine Ausgabe ist das? Reiner Text? --> ja, z.Z. flimmert es über den Bildshirm später evtl. mit ncurses etwas hübscher

    [/quote]


  • Also wenn sich ein Benutzer automatisch anmelden soll - das wirklich gewollt ist - und dann erst dein Programm gestartet werden soll... Wieso machst du es dann nicht über ~/.bashrc :huh:

    meigrafd: wie geht das ?? Habe ich dann auch die Anzeige??

    hier noch die Ausgabe: von Status (habe gerade aktuell noch mal enabel ausgeführt)

    Code
    sudo systemctl status my-terminal-ui@tty1.service
    [sudo] password for adminuser:
    ● my-terminal-ui@tty1.service - Custom user interface on tty1
      Loaded: loaded (/etc/systemd/system/my-terminal-ui@.service; enabled)
      Active: failed (Result: start-limit) since Mo 2016-11-21 04:26:37 UTC; 8min ago
        Docs: http://unix.stackexchange.com/a/318336/5132
    Main PID: 2533 (code=exited, status=203/EXEC)

    hilft das ? Ich habe auch noch einen parallel einfacheren Service mit Ausgabe von hello installier (wie oben empfohlen), bei 1-maligem ausführen mit Start geht der aber auch nicht...
    hoffe noch auf Hilfe :) :danke_ATDE:


  • meigrafd: wie geht das ?? Habe ich dann auch die Anzeige??

    Ich bin zwar nicht meigrafd, aber ich antworte trotzdem mal: Mit "man bash" erfährst Du, welche Dateien die bash beim Start einliest und auswertet. Ich zitiere mal:

    Zitat


    When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/pro‐
    file, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from
    the first one that exists and is readable.

    Heisst: Wenn Du autologin konfiguriert hast (was unten so aussieht), einfach den Aufruf Deines Programms in eine der genannten Dateien im Homedirectory schreiben. Dann solltest Du auch die Ausgabe sehen. ~/.bashrc ist hier vermutlich nicht die richtige Wahl, denn

    Zitat


    When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist.

    der autologin startet vermutlich eine "login shell".


    hier noch die Ausgabe: von Status (habe gerade aktuell noch mal enabel ausgeführt)

    Code
    sudo systemctl status
    [...]
                ├─system-autologin.slice
                │ └─autologin@tty1.service
                │   ├─2539 /bin/login -f
                │   └─2546 -bash
    [...]

    Das sieht für mich so aus, als wäre tty1 tatsächlich durch den offenbar funktionierenden autologin belegt - daß der Versuch, ein weiteres Programm auf dem selben Terminal zu starten, dann fehlschlägt, erscheint mir folgerichtig.

  • Probier es einfach mal so:

    Code
    echo '/usr/local/sbin/autostart-Regelung &' >> ~/.bashrc

    Die .bashrc wird automatisch ausgeführt sobald sich ein Benutzer anmeldet. ~/ ist das HOME Verzeichnis des aktuell angemeldeten Benutzers - wenn du als als "pi" angemeldet bist zeigt ~/ normalerweise auf /home/pi/ ... Wenn du dir unsicher bist ersetz ~/ einfach mit dem absoluten Pfad.

    Wichtig ist das dein Programm in den Hintergrund geschickt wird, deshalb das & am Ende - ansonsten würde .bashrc solange blockiert werden bis sich Dein Programm beendet hat.


  • Die .bashrc wird automatisch ausgeführt sobald sich ein Benutzer anmeldet.

    Ist so nicht ganz richtig: Wenn es sich um eine Login-Shell handelt, führt die bash normalerweise .bashrc nicht aus, sondern "~/.bash_profile, ~/.bash_login, and ~/.profile, in that order" - d.h., die erste dieser drei Dateien, die existiert, und nur diese wird ausgeführt. Unter Raspbian hast Du in gewisser Weise allerdings wieder recht, da hier die Standard-.profile ihrerseits die .bashrc ausführt.


    Wichtig ist das dein Programm in den Hintergrund geschickt wird, deshalb das & am Ende - ansonsten würde .bashrc solange blockiert werden bis sich Dein Programm beendet hat.

    Aber ist das nicht eigentlich das, was Wasserratte will? Ansonsten hat er auf tty1 eine interaktive Shell, deren prompts und Eingaben sich mit der Ausgabe seines Programms mischen. Ich würde das so nicht wollen.

    Einmal editiert, zuletzt von Manul (24. November 2016 um 09:44)

  • Ich glaub nicht das er will das die ~/.bashrc blockiert wird - warum auch? Ich hab aber auch keine Ahnung was das ganze überhaupt soll ;)

    Meine erste Vermutung war dass er einfach nur ein Bildschirm angeschlossen hat und keine Tastatur/Maus. Dann ist es egal ob man auf der gleichen Shell auch Eingaben machen könnte.
    Er brauch dann ja nur "clear" vorher ausführen, dann sein Programm und sieht dann auch direkt dessen Ausgaben auf dem TV oder was auch immer. So wie er meinte will er das aber ja auch noch verschönern, mit ncurses oder so. Vielleicht sollte er über Framebuffer nachdenken ;)

  • meigrafd steht alles in dem verlinkten alten Thread. Er möchte sein Text-GUI (TUI) basiertes Programm "Autostarten". Ohne Login, ohne alles. Der PI wird verbaut. Ich stimme dir zu, das ein GUI/FB Lösung einfacher und besser waere, und auch weniger Probleme beim einrichten machen wuerde, aber er will's genau so. Und es sollte auch möglich sein.


  • Ich glaub nicht das er will das die ~/.bashrc blockiert wird - warum auch?

    Gegenfrage: Warum nicht? Sobald .bashrc abgearbeitet ist, gibt die bash ein prompt aus und wartet auf Eingabe. Klar, das Warten auf Eingabe stört nicht weiter, insbesondere, wenn gar keine Tastatur angeschlossen ist, und das prompt scrollt wahrscheinlich relativ schnell aus dem Bildschirm - aber wenn beides gar nicht gewünscht ist, warum es dann nicht gleich unterbinden?

  • Ja oke - das stimmt schon, trotzdem würde ich vorher ein "clear" ausführen wenn es denn wirklich so über ein Autologin gewollt ist ;)

    Hab das mal illustriert, in dem ich folgendes in ~/.bashrc eingetragen habe:

    Code
    while true; do echo $RANDOM; sleep 1; done

    Was dann nach einem Login passiert:

    Also noch viel unschöner Text zu sehen

Jetzt mitmachen!

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