Probleme beim Autostart (Benutzerrechte und Display)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo alle miteinander,

    ich habe mein Problem in einem anderen Threat kurz geschildert und die Empfehlung bekommen, einen neuen zu öffnen...

    Ausgangspunkt:

    Ein Freund hat mich auf die Jukebox4Kids (hier) hingewiesen, welche auch hier im Forum veröffentlicht wurde.

    Ich fand's sofort geil, weil das mit den CD's bei kleinen Kindern echt so ne Sache ist.

    Aber ich hab das Programm nicht gecheckt und wollte auch einfach selber mal was programmieren.

    Ich hab mal ein Foto von der (fast) fertigen Musikbox angehängt.

    Aufbau:

    Ich habe auf Playlists verzichtet. Es werden einfach die Lieder von 1.mp3 durchnummeriert. Im Verzeichnis liegt eine .txt-Datei, welche angibt, wieviele Lieder in dem Ordner sind. Somit werden alle lieder Nach-und-nach abgespielt, bis das letzte fertig ist.

    Mittels RFID können die "CD's" gewechselt werden. Auf den RFID-Karten ist auch nur eine Zahl gespeichert. Diese ist der Name des Ordners. Die Ordner sind auch einfach von 1 bis ... durchnummeriert.

    Am Gehäuse ist ein USB-Anschluss angebracht. Darauf befinden sich die Lider, dann können diese relativ einfach ausgetauscht bzw. neue hinzugefügt werden.

    Ich hab ein 2-Zeiliges Display mit je 16 Zeichen verbaut, welches mittels I2C angesteuert wird. Das zeigt so Zeugs an wie Liednummer und Name der "CD" und zählt die Liedzeit mit.

    Problem1:

    Ich habe lange rumprobiert, bis das mit dem Autostart funktioniert hat. Es lag wohl daran, dass ALLE Dateien ausführbar sein müssen. Leider bekomme ich die Lieder auf dem Stick nicht ausführbar gemacht. Sowohl über die Shell, als auch über den Desktop gehts nicht.

    Frage1:

    Weiß mir jemand eine Lösung, wie die Dateien auf dem USB-Stick aufrufen kann? Also im Autostart.

    Problem2:

    Das Display funktioniert im Autostart nicht so richtig. Starte ich das Programm über den Desktop oder die Shell, dann läuft es. Im Autostart zeigt es entweder nur Hieroglyphen an oder nur die erste Zeile mit einem extrem schlechten Kontrast.

    Frage2:

    Muss ich da irgendwas beachten, umstellen oder sonst so, damit es gescheit läuft??

    Nochmal ne kurze Erläuterung:

    Ich hab mal den Code und zwei Screenshots vom Desktop des Pi angehängt.

    Auf dem einen findet man die (geöffneten) .txt-Dateien vom Ordner /home/pi/ und auf dem Anderen die .txt-Dateien aus dem Ordner 1. Nur zur Veranschaulichung des Codes.

    Mittels Maxvol.txt kann die maximal mögliche Lautstärke gedrosselt werden. Das habe ich aber bisher nur mal so eingebaut, aber noch nicht benutzt. Man könnte es auch mit RFID-Karten im normalen Betrieb verwenden und die Lautstärke auf 75% oder 50% drosseln (oder wie auch immer).

    Nach jedem Liedwechsel wird die Datei songid.txt aktualisiert, dann kann er nach dem Start wieder beim letzten Lied weitermachen.

    Wenn der Ordner mit einer RFID-Karte gewechselt wird, dann wird der Ordner auch in der txt-Datei gespeichert.

    Mit den Knöpfen kann man Start/Pause, Stopp, Vor, Rück, lauter und leiser machen. Wenn man die Stopptaste über 2,5 Sekunden lange gedrückt hält, dann beendet sich das Programm und der Raspberry fährt runter.

    In Zeile 28 befindet sich die Variable mit welcher ich den Pfad von der SD-Karte auf den USB-Stick ändern könnte.

    Reicht das an Input? Oder habe ich was elementares vergessen?

    Schonmal Danke im Voraus.

    Grüße

    Alex

    Hier mal der komplette Code (ist aber auch extra angehängt)

  • Probleme beim Autostart (Benutzerrechte und Display)? Schau mal ob du hier fündig wirst!

  • Hallo Sprudelkarre !

    Sehr schön geworden, Deine Jukebox! Bei Deinen Programmierkünsten sehe ich allerdings noch, wie soll ich sagen, viel Potential. ;)

    Aber immerhin: Du hast Dich selbst durchgekaut und eine für Dich funktionierende Lösung hinbekommen. Das zeigt schon mal deutlich mehr Eigeninitiative als viele andere Neulinge offenbar aufzubringen bereit sind, die gerne eine fertige Lösung auf einem Silbertablett hätten und zwar maßgeschneidert und gefälligst gestern. Finde ich super!

    Jetzt sollten wir erst mal versuchen, Dein Autostartproblem in den Griff zu bekommen. Ob Du Dich danach noch damit beschäftigen willst, wie sich Dein Programm eleganter umsetzen ließe, liegt dann bei Dir.

    Zu Deinem "Problem1": Ich fürchte, hier liegst Du mit Deiner Analyse des Problems daneben. Die Musikdateien auf dem USB-Stick müssen mit Sicherheit nicht ausführbar sein, um einen Autostart Deines Skriptes hinzubekommen. Können Sie auch gar nicht, da der Stick vermutlich FAT-formatiert ist und dieses Dateisystem die entsprechenden Rechte gar nicht unterstützt. Das Problem muss also woanders liegen. Wo ist allerdings schwer zu sagen, wenn Du uns nicht verrätst, wie Du den Autostart umgesetzt hast. Zu sagen, da gebe es mehr als eine Lösung, grenzte an Untertreibung. Also beschreibe bitte genau, was Du getan hast, damit Dein Skript automatisch startet.

    Ich fürchte, ohne diese Information lässt sich auch zu Problem2 nichts sagen. Wobei ich da etwas verwirrt bin: Problem1 ist, daß Du den Autostart nicht hinbekommst und Problem2, daß sich das Skript im Autostart nicht wie gewünscht verhält. Woher weißt Du das, wenn der doch gar nicht funktioniert?

  • Hi Manul

    danke für das Lob. Ich hatte vor ca. 20 Jahren (in der Realschule) mal ein bisschen Programmieren gelernt... Naja. Egal :)

    Zwecks USB-Stick hab ich mich glaub nicht ganz richtig ausgedrückt. Ich hab die Lieder jetzt auf die SD-Karte gepackt. Seitdem läuft es mit dem Autostart.

    Zum Test habe ich das Programm eingekürzt, dass es nur noch den Startsound abspielt. Auf der SD-Karte hat es funktioniert. Wenn ich die Datei auf den Stick verschiebe (und den Pfad im Programm ändere), dann läuft es nicht mehr.

    Zum Autostart habe ich anfangs ein init.d-Script geschrieben und es mit Cron und rc.local probiert. Letztendlich hat es am Ende mit Cron funktioniert (aber halt nur mit den Mp3's auf der SD-karte). Drum nehme ich aktuell cron. Bin aber für alle Schandtaten bereit.

    Warum ist mir USB lieber? Der USB-Stick ist von außen zugänglich und kann somit leicht mit neuen Liedern befüttert werden. Jetzt muss ich die Lieder auf den Stick ziehen und über den Desktop vom Pi auf die SD-Karte verschieben. Und: Die SD-Karte hat viel weniger Speicherplatz als der Stick. Gut, das wäre jetzt einfacher lösbar.

    Das Programm stürzt momentan gelegentlich ab, wenn mittels RFID ein neuer Ordner geöffnet wird. Von daher könnte ich mir am Ende tatsächlich noch Gedanken machen, wie das Programm eleganter umzusetzen wäre.

    Ich hab mich schon gefragt, ob ich nicht ein weiteres Programm im Hintergrund laufen lasse, welches mein Musikbox-Script nach einem Absturz wieder startet.

    Aber da müsste ich erst mal rumprobieren. Gerade auch deswegen, weil ich mir nicht sicher bin, ob ich die GPIO's mit verschiedenen verwenden kann. Aber das ist jetzt nicht das Problem bzw. die Fragestellung.

  • Okay, die momentan aktuellste Variante, als Nutzer ein Programm automatisch starten zu lassen, ist m.W eine systemd user service unit. Ich bin da auch kein Experte, aber die könnte bspw. so aussehen:

    Code
    [Unit]
    Description=Franziskas Jukebox
    
    [Service]
    ExecStart=/pfad/zu/deinem/skript.py
    Restart=always
    
    [Install]
    WantedBy=default.target

    Das würdest Du in einer Datei ~/.config/systemd/user/jukebox.service speichern. Dann müsstest Du als der User, unter dem die Jukebox läuft, die service unit noch aktivieren:

    Code
    systemctl --user enable jukebox.service

    und, damit die Jukebox nicht erst beim ersten Einloggen des Nutzers, sonder schon beim Booten startet, den Nutzer dafür freischalten:

    Code
    sudo loginctl enable-linger <userid>

    Warum der Autostart mit Liedern vom USB-Stick nicht klappt, kann ich Dir auf Anhieb auch nicht sagen. Möglicherweise startet die Jukebox, bevor der Stick überhaupt gemountet ist. Mit der service unit sollten aber zumindest eventuelle Fehlermeldungen im systemd-Journal landen. Das kannst Du Dir nach dem Booten mit journalctl --user ansehen. Vielleicht ergibt sich so ja ein Hinweis auf den Fehler.

    Nachtrag: Durch das Restart=always sollte die Jukebox bei einem Absturz auch automatisch wieder gestartet werden, diese Funktionalität liefert kriegst Du bei systemd gratis dazu.

    • Offizieller Beitrag

    Hallo,

    Es lag wohl daran, dass ALLE Dateien ausführbar sein müssen. Leider bekomme ich die Lieder auf dem Stick nicht ausführbar gemacht.

    :conf: Seltsam...

    Befindet sich der User, über den Dein Script läuft, in den Gruppen audio und (zwecks USB) plugdev? Ist der Stick per Automount eingebunden oder hast Du manuell in einen bestimmten Ordner gemountet, wenn ja wie? Bzw. versuchs mal in einen Ordner im Homeverzeichnis des entsprechenden Useres manuell.

  • Hi Leute,

    vielen Dank für die Antworten. das mit dem Autostart teste ich demnächst. Also sobald ich dazukomme. Vielleicht löst sich damit auch gleichzeitig das Problem mit der seltsamen Darstellung am Display.

    Zwecks USB-Stick gehe ich von Automount aus, da ich den einfach engesteckt habe und dann ist er unter /media/pi/JUKEBOX/ erschienen (Der Stick heißt JUKEBOX).

    Aber ich muss zugeben, dass ich bezüglich Mounten keinen blassen Schimmer habe. Ich weiß nicht mal genau, was das heißt. Ich kanns nur schätzen.... Wird wohl ums einbinden ins System gehen.

    Aber der Einwand, dass der Stick beim Start des Programms noch nicht bereit ist, ist berechtigt. Ich versuche es mal und lasse den Startsound auf der SD-Karte. Da hätte der Stick dann 7 zusätzliche Sekunden, bis Daten von im verlangt werden. vielleicht klappts ja dann.

    Ich melde mich, sobald ich dazugekommen bin, mich mit dem Programm weiters zu beschäftigen.

    • Offizieller Beitrag

    Ein paar Fragen hätte ich noch dazu:

    Kannst Du manuell (wie auch immer) auf die Dateien vom Stick zugreifen, bzw. abspielen?

    Welches Dateiformat hat der Stick, ist das evtl. NTFS?

    Wie ist die Ausgabe von mount -l?

    Achso die Lektüre: https://wiki.ubuntuusers.de/mount/ ;)

  • Ich hab mir das mit dem Mounten mal durchgelesen. Klingt vielversprechend. Habe auch meinen ursprünglichen Verdacht mit den Root-Rechten der MP3's aus der Welt geschafft. Könnte also tatsächlich so sein, dass Ihr recht hattet :*

    Folgende Ausgabe hat der Befehl Mount gebracht:

    Habe ich das richtig verstanden, dass ich den Stick so einbinden kann, dass er bereits im Bootvorgang "vorhanden" ist?

    Das sollte mittels /etc/fstab funktionieren. Könnte das so aussehen? UUID=22F7-15F0 /media/pi/JUKEBOX vfat umask=007,uid=pi,users 0 0

    Zitat

    Das würdest Du in einer Datei ~/.config/systemd/user/jukebox.service speichern. Dann müsstest Du als der User, unter dem die Jukebox läuft, die service unit noch aktivieren:

    Manul Wie komme ich in das Verzeichnis?

    • Offizieller Beitrag

    Das sollte mittels /etc/fstab funktionieren. Könnte das so aussehen? UUID=22F7-15F0 /media/pi/JUKEBOX vfat umask=007,uid=pi,users 0 0

    Ich würde es so versuchen:

    UUID=22F7-15F0 /media/pi/JUKEBOX vfat rw,suid,dev,exec,auto,noatime,users,sync,nofail 0 0

    Besser wäre imho, wenn Du im Homeverzeichnis des Useres (vermutlich pi) den Ordner JUKEBOX anlegen würdest und dahin mountest, also nach /home/pi/JUKEBOX statt wie in Deiner Frage nach /media/pi/JUKEBOX. ;)

  • So, jetzt hab ich mal wieder etwas "gespielt"

    1. Die Info mit dem Systemd ist genial.

    Beim ersten Versuch hab ich die Start.mp3 auf dem hinterlegt. Anhand vom Display konnte ich erkennen, dass das Programm 3x nicht starten konnte. Beim 4. mal ist es dann gelaufen. Wird wohl daran liegen, dass der Stick bei den ersten 3 Versuchen noch nicht richtig gemountet (ja, hab die Lektüre gelesen) war.

    Positiver Nebeneffekt: Das Display zeigt jetzt auch genau das an, was es soll! Ich bin begeistert!

    2. Hab in /etc/fstab den Stick angegeben.

    Vorteil: Programm startet direkt richtig.

    Nachteil: Display zeigt noch mehr Müll an als vor der Umstellung auf Systemd

    NACHTEIL: Das Programm läuft doppelt. Interessanterweise laufen unterschiedliche Lieder, obwohl das Programm auf einheitliche Angaben zugreift.

    Ich kann beide "Nachteile" nicht nachvollziehen. Aber ich hab auch nicht verstanden, warum das Display beim Start mit Cron nur ab und zu halbwegs funktioniert.

    Meine (momentane) Lösung:

    Hab die Startdatei auf der SD-Karte angesprochen, dadurch bleiben dem Stick 7 zusätzliche Sekunden zum Mounten. Der Rest wird vom Stick geladen.

    Das hat bis jetzt soweit funktioniert. den Inhalt in der fstab hab ich einfach mal auskommentiert.

    Da das Programm beim CD-Wechsel mittels RFID gelegentlich abstürzt, startet es jetzt von alleine erneut. Meine Frau musste bisher immer den Stecker ziehen und somit hart neu starten. Das hab ich mir jetzt öfters anhören müssen :@

    Wobei es beim Start mit Systemd im Vergleich zu Cron gefühlt viel stabiler läuft.

    Jetzt will ich auf dem Display einen Lauftext integrieren, da die CD-Namen teils sehr lange sind und die Kinderlieder-CD's meist so beginnen: Die 30 besten Kinderlieder (zum Tanzen / zum Singen) etc. Blöd, dass nach 16 Zeichen das Display zu ende ist. Nur mal als Info am Rande. Muss mal schauen, wie ich mir das ins Programm einbaue. Wenn ich was hab, kann ich es ja mal zeigen.

    Manul Du hast anfangs von Potential und eleganteren Lösungen geschrieben. Was hast du da so gemeint?

    Ich möchte auf jeden Fall die <print>-Befehle entfernen, da ich die nur anfangs gebraucht habe um zu sehen, wie das Programm so läuft. Schließlich sind die jetzt ja unnötig.

  • Nachteil: Display zeigt noch mehr Müll an als vor der Umstellung auf Systemd

    NACHTEIL: Das Programm läuft doppelt. Interessanterweise laufen unterschiedliche Lieder, obwohl das Programm auf einheitliche Angaben zugreift.

    Ich kann beide "Nachteile" nicht nachvollziehen. Aber ich hab auch nicht verstanden, warum das Display beim Start mit Cron nur ab und zu halbwegs funktioniert.

    Ich weiß jetzt warum...

    Hatte das Problem, dass das Programm nicht startet, da der USB-Stick anstelle vom Ordner JUKEBOX in den Ordner JUKEBOX1 gemountet wurde. Hab mir dann mal das Journal vom Boot angeschaut und dort entdeckt, dass in der rc.local noch die Vorgängerversion meines Programmes geöffnet werden soll.

    Durch das feste Mounten konnte auch dieses Programm starten, drum liefen zwei. UND ziehmlich sicher hat das Display deshalb nur Müll angezeigt. Es wurde ja schließlich von zwei Programmen angesprochen.

    Von daher werde ich den Stick mal wieder wie oben von hyle beschrieben per fstab mounten.

    Ich berichte 8)

Jetzt mitmachen!

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