Probleme mit dem Autostart eines eigenen Scriptes

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

    ich weiß dieses Thema wurde schon x mal behandelt.

    Und die erste Antwort wird sicher kommen, benutze die Suchfunktion. Dies hab ich auch gemacht von daher habe ich schon einiges gemacht.

    Jetzt erstmal zu den Vorbereitungen welche ich erleidigt habe:

    • Datei Ausführbar gemacht für ALLE Benutzer. Also chmod 777 (ist mehr als nur Ausführbar aber egal)
    • Ich habe die Datei aus den Tiefen von Unterverzeichnissen ans Tageslicht geholt und einfach in den Pfad /home/pi/ abgelegt es geht um die Datei memwatch.sh
    • Ich nutze das Script aus meinem Projekt über die Speicherampel ... nur habe ich alle Echos aus dem Script entfernt
    • Ich habe manuell das Script über ./memwatch.sh & gestarten und in den Hintergrund geschickt. Als ausgabe erhielt ich eine kleine Info aus einer mehrstelligen Ausgabe [1] 4306
    • Das Script tat was es soll.


    Nun habe ich folgende Dinge Probiert um das Script automatisch beim Systemstart zu starten:

    • in die Crontab -e eingefügt mittels der Zeile: @reboot /home/pi/memwatch.sh &
    • in die Datei /etc/rc.local/ vor der Zeile exit 0 habe ich /home/pi/memwatch.sh & eingetragen
    • ich hab mir ein Autostartscript mit zur Hilfe nahme folgender Seiten gebaut: Link und link (letzter Beitrag um Fehlermeldungen zu beseitigen) lediglich folgende Meldung blieb mir über: "update-rc.d: using dependency based boot sequencing"


    Nur leider tat sich bei allen Versuchen NIX NADA. Also LEDs blieben aus und ich verzweifel langsam, da ich den Pi nun bestimmt schon 20 mal neu gestarten habe mit allen möglichen Variationen und co.

    Vielleicht kann mir sonst hier jemand helfen oder hat ein Goldenen Einfall wo das Problem liegen könnte.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Hallo und guten Morgen,

    mir fällt da auf Anhieb nur ein möglicher Fehler ein:

    Die Bedingung(en) ind Deinem script treffen nicht zu (Logikfehler) und das script läuft ohne dass Du es merkst.
    Hast Du mal mit ps überprüft, ob das script nicht doch gestartet wird?

    cu,
    -ds-

  • Okay hier erstmal der Code:


    Das die Echos auskommentiert sind, ist gewollt. Und das Script soll den Speicherzustand ermitteln und soll diesen mittels 3 LEDs anzeigen. Ob das die optimale berechnung des Speicherzustandes ist, sei dahingestellt. Aber das soll ja keine Auswirkung auf mein Problem haben.

    Und hab geguckt und das Script ist tatsächlich NICHT am laufen. Also hab mal per ps nachgeguckt.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (11. März 2014 um 10:34)

  • Ok, ich gehe davon aus, daß das Script - von der Kommandozeile aus gestartet - problemlos läuft. Logikfehler wären dann also auszuschliessen.

    Wenn es z.B. aus "/etc/rc.conf" oder über /etc/crontab gestartet wird, läuft es normalerweise unter root. In diesem Fall wahrscheinlich auch eher positiv als negativ zu werten. :)

    Was mir dazu noch einfällt: Nachdem die Kommandos im Skript ohne komplette Pfadangabe erfolgen - hast Du evtl. "aliase" für das ein oder andere Kommando in ".bashrc" oder sonstwo eingetragen?

    Braucht "trap" evtl. eine Konsole o.ä. (da hab ich aber selbst keine Erfahrung), würde ich zum Testen mal weglassen

    Gruß, mmi

  • So habe es getestet. Also ich habe "trap" einfach auskommentiert. Nur ergebnis das selbe, also es passierte überhaupt Nix.

    Und ne Alias habe ich für nichts definiert. Also benötige ich dort keine Pfade.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Sind die LEDs vielleicht über ein MOSFET array angeschlossen, das nach Masse schaltet? Dann würden sie sich "umgekehrt" verhalten. Trifft bei Dir aber wahrscheinlich auch nicht zu, denn mind. eine müsste ja trotzdem leuchten, wenn auch nicht logisch richtig ;)

    Seltsam - da fällt mir im Moment auch nix mehr ein.

    Du verwendest ja die Routinen vom "wiringpi" (hiess es so?) Autor. Die sind soweit sicher ok (wenn bei Direktaufruf alles klappt), aber vielleicht gibt es da ja Probleme, wenn sie so standalone unter root laufen?

  • Entweder komplette Pfade angeben oder die $PATH setzen mit allen Pfaden in denen "Programme"stehen.

    Lenk doch mal z.B. für den Start via rc.local die StdOUT und stdERR in eine Datei um, vielleicht gibs ja ne Fehlermeldung.
    Zusätzlich könntest du noch ein oder mehr Echos einbauen, um zu guggen wo das etwa wohlmöglich nicht so tut wie es soll.
    Was ist mit den gpio's kann man die schon zu jeder Zeit beim booten ansprechen? (Kenn mich mit denen noch nicht aus)

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

    Einmal editiert, zuletzt von Lunepi (10. März 2014 um 10:33)

  • Moin, moin,

    hier fehlt schon mal definitiv eine eckige Klamme zu:

    Code
    if [ "$led_status" -ne 1


    so dürfte der test nicht funktionieren.
    Oder ist das ein Tipp-/Copy-Paste-Fehler?

    cheers,
    -ds-

  • dreamshader: nein leider kein copy&past fehler


    @ RaspiDo: Mir ist so als hättest du dieses Thema bzw Problem schon mal gestellt, nämlich hier: https://www.forum-raspberrypi.de/Thread-tutoria…=68524#pid68524

    Auch in Deinem Thread hatte ich einige Fehler in deinem Script aufgezeigt mit dem selbst andere User es nicht zum laufen gekriegt haben - du solltest also unbedingt das richtige Script posten, aber nicht aus Faulheit das fehlerhafte aus deinem Thread

    Was mir auch hier, wie auch schon in dem anderen Thread, von dir immer noch fehlt ist die tatsächliche Bearbeitung der Dateien also womit du die Editiert hast.... Leider hast du deine /etc/rc.local auch hier nicht gepostet
    /etc/rc.local ist eine Ausführbare Datei, deshalb muss in der ersten Zeile #!/bin/sh stehen.. Trag also mal deine Zeile ein und führ die Datei dann EXAKT so wie folgt aus:

    Code
    /etc/rc.local

    NICHTS davor schreiben! Die Zeile ist so wie ich sie hier angebe korrekt! KEIN bash oder sh vor die Datei einfügen!
    (es kam schon oft vor das User dies nicht beachtet haben und eben nicht das so ausführten wie ich es vorgab, deshalb BETON ich es hier erneut: kein punkt, kein bash, kein sh, kein sonst was davor setzen!)

    Das nächste wäre das ein Eintrag in /etc/crontab minimal anders aussehen muss als es in crontab -e der Fall ist!

    Wenn es ein Problem mit crontab gibt kann man das anhand einer Konrtolle des syslogs feststellen -> /var/log/syslog

    Um sicher zu gehen das es wirklich nicht an deinem fehlerhaften memwatch.sh , sondern an den Systemdateien liegt, könnte man auch ein einfaches Echo in den "autostart" einfügen und dadurch feststellen ob auch dieser nicht ausgeführt wird


    Du machst jetzt bitte ALLES nachfolgende:

    crontab -e

    Code
    @reboot  /bin/echo "TEST crontab -e" >>/tmp/autostart.txt

    sudo crontab -e

    Code
    @reboot  /bin/echo "TEST sudo crontab -e" >>/tmp/autostart.txt

    /etc/crontab

    Code
    @reboot  root /bin/echo "TEST /etc/crontab" >>/tmp/autostart.txt

    /etc/rc.local

    Code
    /bin/echo "TEST /etc/rc.local" >>/tmp/autostart.txt &

    Anschließend rebooten und nach Reboot postest du hier bitte die Ausgabe des Befehls:

    Code
    cat /tmp/autostart.txt

    copy&past machst du über PuTTY so: Mit der linken Maustaste alles markieren und dann hier im Forum Einfügen

  • Sry für die Versäumnisse. Hatte es irgendwie vergessen das Script in meinem Tutorial zu ändern.

    Habe zumindest die ersten Fehler ausgemerzt, von wegen des fehlenden ], der Verbesserung bei if und do Konstruktionen, sowie die Formatierung des Codes mittels Tabs.

    Die bessere Speicherauswertung werde ich noch korrigieren. Am besten gleich im Anschluß.


    Und nun zu den anderen Punkten:

    Als Editor nehme ich vorzugsweise den "mcedit". Primär aus Gewohnheit zu den Dos Zeiten bzw. weil ich bei dem den Kompfort besser finde.

    So und hier meine Aktuelle /etc/rc.local - Datei:


    Ich habe es aber davor getestet, bevor ich die Zeile bash /home/pi/memwatch.sh & auskommentiert habe, sowie die Zeile mit dem /bin/... eingefügt habe.

    Und dabei ging dann das Script los. Also ich hab gesehen, dass die LED an ging, als ich die Datei "/etc/rc.local" ausgeführt habe.

    Nun noch die Ausgabe von cat /tmp/autostart.txt

    Code
    TEST /etc/crontab
    TEST sudo crontab -e
    TEST /etc/rc.local


    Ich hoffe, ich hab nun nichts mehr übersehen, was ich machen sollte bzw. Zeigen sollte.

    Noch eine Kleine Info zusätzlich, ich habe das selbe auf meinem zweiten Pi mit einer anderen SD - Karte auch versucht und Ergebnis ist das selbe. Also kein Autostart des Scriptes memwatch.sh


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (12. März 2014 um 03:04)

  • Auf die Gefahr hin, als absoluter Anfänger Unsinn zu reden: das bash gehört da nicht hin bei deinem Befehl, oder?
    Da muss nur die ausführbare Datei inkl. Pfad stehen und nicht "bash /Pfad/datei.sh"
    Im Übrigen, auch wenn das sicher nicht die geringste Rolle spielt, sehe ich die angeblich auskommentierten echo Zeilen in dem von dir geposteten Script nicht.

    Greez,
    bz

    Einmal editiert, zuletzt von Bollzahn (11. März 2014 um 10:28)

  • Hi, das weiß ich, danke. Ich hab es oben nicht gesehen, weil aus irgendwelchen Gründen der gesamte Codeblock auf meinem iPad um eine Stelle nach links eingerückt war, so dass ich keine # vor den echo Zeilen gesehen habe.

    Aber wie ist das denn jetzt mit dem bash Befehl? Funktionieren tut bei mir beides, wenn ich als User händisch /etc/rc.local ausführe. Aber in meinen crontab's und auch in den anderen Zeilen in rc.local wo ich im Laufe der Zeit nach der ein oder anderen Anweisung Shellscripts angegeben habe, wird immer nur der Pfadverweis angegeben, und nicht nochmal ein bash davor.

    Greets,
    bz

    Einmal editiert, zuletzt von Bollzahn (11. März 2014 um 11:09)


  • Auf die Gefahr hin, als absoluter Anfänger Unsinn zu reden: das bash gehört da nicht hin bei deinem Befehl, oder?

    Da muss nur die ausführbare Datei inkl. Pfad stehen und nicht "bash /Pfad/datei.sh"

    Wieso nicht?
    Dadurch wird die Datei an den Interpreten zum verarbeiten übergeben. Solange in der Datei auch wirklich bash Code steht ist das eigentlich kein Problem - allerdings würde ich an dieser Stelle eher die vollständigen Pfade nutzen da nicht unbedingt sicher sein kann das er auch "bash" findet...
    Die PATH variable wird nämlich nicht gleich am Anfang des Bootvorgangs gesetzt sondern erst irgendwo am Ende.. Wenn man einfach nur "bash" ausführen will, sucht Linux in allen Verzeichnissen die in $PATH hinterlegt sind, nach dem Programm/Script namens "bash"
    UM dieses Problem zu umgehen wird generell dazu geraten vollstände Pfade anzugeben, was also hierbei bedeuten würde: /bin/bash

    Wichtig ist nur das man nicht versucht bash Code über sh auszuführen - sh ist älter und kann somit nicht das was bash kann.. bash ist aber abwärtskompatibel also kann man sorum nichts falsch machen

    Im Übrigen, auch wenn das sicher nicht die geringste Rolle spielt, sehe ich die angeblich auskommentierten echo Zeilen in dem von dir geposteten Script nicht.

    Er hat nicht SEIN Script, welches er tatsächlich einsetzt, gepostet sondern Copy&Past aus seinem Thread gemacht - das erkennt man vorallem an der Zeile " Code: Alles markieren ". Das habe ich bereits bemängelt....


    RaspiDo: Wir haben ja nun festgestellt das es nicht an /etc/rc.local liegt denn die wird problemlos ausgeführt - somit bleibt weiterhin nur das über was dort eingetragen wird, also Dein Script...

    Dann poste jetzt mal bitte exakt das memwatch.sh Script was bei dir auf dem PI ausgeführt werden soll und, wie auch schon in dem anderen Thread gesagt, die Dateirechte

  • Oker hier den Code direkt aus Putty Kopiert:


    Und hier die Rechteausgabe via ls -all


    Code
    -rwxrwxrwx  1 pi   pi      770 Mär 11 14:00 memwatch.sh


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Sorry,

    ich bin glaube, ich nicht immer der hellste :wallbash::wallbash::wallbash:, ich hoffe ich hab mir das Script und die /etc/rc.local Datei noch mal angeguckt und da etwas noch versucht.

    Ich habe

    Code
    bash /home/pi/memwatch.sh

    gegen

    Code
    /bin/bash /home/pi/memwatch.sh

    ersetzt. Und nun läuft es. Habe es auf 2 Pis getestet und bei beiden tut es nun seinen Dienst.


    Michael

    PS: Aber trotzdem 1000 und 1 Dank an die, die mir geholfen haben und mit Sicherheit auch mal fast verzweifelt sind an mir. :danke_ATDE: :danke_ATDE: :danke_ATDE:

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (12. März 2014 um 00:53)

Jetzt mitmachen!

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