Autostart: Shell Script wird nicht richtig ausgeführt

  • Hallo zusammen,

    ich habe ein Problem mit dem Starten eines Shell Scriptes im Autostart auf meine Pi 3. Ich benutze eine Relais-Karte und jetzt geht es darum, dass der ursprüngliche Zustand der Relais nach einem Stromausfall (und damit Neustart des Pis) wieder hergestellt wird. Dazu habe ich einfach eine Textdatei, in der der Zustand bei jeder Änderung der Relais als Zahl gespeichert wird.

    Das Script soll jetzt beim Neustart einfach die Zahl aus der Datei auslesen und per If-Abfrage eben die Relais-Stellung wieder herstellen. Wenn ich das Script per Hand aufrufe, tut es genau was es soll. Allerdings geht es nicht, wenn es per Autostart aufgerufen wird (ich habe alle gängigen Methoden wie rc.local, crontab, startup job, lxde versucht). Wenn ich mit htop nach den laufenden Prozessen schaue, so ist der Prozess dort orange markiert zu sehen, was mich stutzig macht, da das Script ja nur einmal durchläuft und längst fertig sein sollte.

    Hier mein Code:

    Die drei Scripte in den If-Abfragen stellen nur die Relais ein.

    Vielen Dank schonmal für Eure Hilfe!

    Grüße

    ni28

  • Autostart: Shell Script wird nicht richtig ausgeführt? Schau mal ob du hier fündig wirst!

  • ni28 Das funktioniert ja schon mal nur dann, wenn das aktuelle Arbeitsverzeichnis stimmt, weil alle Dateien dort relativ angegeben sind. Also die Frage: Stimmt das aktuelle Arbeitsverzeichnis denn wenn Du das wie auch immer nicht manuell startest?

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

  • Hm eine Kleinigkeit scheint doch noch irgendwo in einem anderen Script zu sein. In diesem werden drei Eingänge gepolled und anhand dieser Eingänge die Relais gestellt. Auch dieses Script soll per Autostart gestartet werden (ja ich weiß, Interrupt ist schon schöner, aber es geht nur ums Ausprobieren und sonst läuft kein Script dauerhaft).

    Auch in diesem Script waren die Pfade nicht absolut. Das hab ich geändert. Aber auch jetzt lässt sich das Script zwar per Hand starten, nicht jedoch im Autostart. Auch wenn ich die Endlosschleife wieder raus nehme, geht's nicht. Hab ich noch was übersehen? Beim vorherigen Script hat's ja geklappt mit den absoluten Pfaden:/

  • Redirecte doch mal die Ausgaben beim Aufruf des Scripts im Autostart in eine Log Datei. In der solltest Du dann Fehlermeldungen sehen die Dir eine Indikation geben wo der Hase im Pfeffer liegt :)

  • hyle Wenn die Scriptausgaben in eine Log Datei geschrieben werden sollte das eigentlich irrelevant sein. Aber sehen wir mal :shy:

  • ni28 Die Endlosschleife würde ich mit ``true`` schreiben. Und sei es nur um zu vermeiden das Leute das lesen und denken die 1 hätte irgendwie eine besonders ”wahre” Bedeutung.

    Bei der Bash nehme ich immer ``[[ … ]]`` für Tests. Dann muss man sich beispielsweise weniger Gedanken ums ”quoten” machen.

    Das die Ausgaben auf die Pins nach dem Ausgabewert und nicht nach der Pinnummer sortiert sind, finde ich verwirrend.

    Da steht ja im Grunde dreimal kopiert und leicht angepasst Code mit der gleichen Struktur mit unterschiedlichen Werten. Solche Wiederholungen vermeidet man als Programmierer eigentlich immer durch Schleifen und/oder Funktionen.

    Die beiden verschachtelten ``if`` in jedem der Blöcke kann man mit einem einzigen ``if`` abfrühstücken.

    Ich würde da ja noch eine kleine Wartezeit einbauen, damit das Polling nicht 100% CPU-Zeit verbraucht. Ich weiss es wird Winter, aber man kann auch anders heizen. ?

    Zwischenstand, ungetestet, und natürlich immer noch mit dem Problem, falls ich das nicht aus Versehen gefixt habe:

    Ich persönlich würde da wahrscheinlich zur leichteren Lesbarkeit mindestens zwei bis drei Funktionen einführen.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

  • Hallo,

    danke für Eure Antworten.

    Autostart womit (auf welche Weise) und mit welchem Befehl genau? :gk1:

    Wie eingangs beschrieben, hab ichs mit allen gängigen Methoden versucht ohne Erfolg. Zur Zeit mache ich es über rc.local

    Redirecte doch mal die Ausgaben beim Aufruf des Scripts im Autostart in eine Log Datei. In der solltest Du dann Fehlermeldungen sehen die Dir eine Indikation geben wo der Hase im Pfeffer liegt :)

    Bin mir nicht ganz sicher, ob ich es richtig gemacht habe. Wollte stdout und stderr speichern und habe dafür in rc.local den Script-Aufruf folgendermaßen angepasst:

    Bash
    /home/pi/Desktop/steuerung.sh >> error.log 2>&1

    Die Datei ist nach reboot leer.

    @__blackjack__: Ja du hast recht, dass der Code nicht sehr "effizient" geschrieben ist. Das liegt hauptsächlich daran, dass ich zwischendurch immer wieder was geändert hab (uA wegen dem Autostart Problem). Die Reihenfolge des Setzten der Pins hat tatsächlich so einen Sinn, da die Reihenfolge mit Ausschalten und Einschalten eingehalten werden muss. Da kommen auch noch sleeps dazwischen, damit die Relais auch genug Zeit zum schalten haben. Aber trotzdem danke für deine Anmerkungen, ich werde sie später sicherlich beherzigen.

  • Hallo,

    auch nach weiteren Versuchen hat sich am Verhalten des Scripts nichts geändert. Eine Fehlermeldung (wie ich in meinem vorherigen Post geschrieben habe) sehe ich auch keine.

    Was mir noch aufgefallen ist: Wenn ich mir mit htop den Prozess, der durch Autostart gestartet wurde, anschaue, so ist als User "root" eingetragen. Wenn ich das Script von Hand starte, ist es der User "pi". Das ist ja auch nachvollziehbar. Könnte dies aber zu meinem Fehlerbild führen? Zumindest kann es doch kein Problem mit den Rechten sein, wenn das Autostart-Script als root ausgeführt wird?

    Danke für Eure Antworten und Grüße

    ni28

  • Hallo,

    ich denke, ich habe das Problem lokalisiert.

    Ich habe das Script jetzt nochmal in C geschrieben. Auch hier passiert das selbe. Aus diesem Grund habe ich den Aufruf des zweiten sh-Scripts raus genommen und dessen Inhalt direkt in meinem C Programm eingebaut. Und jetzt kann ich auch in meiner error-Datei einen Fehler sehen. Ich rufe per SSH auf einem anderen Pi ein Script auf und hieran scheint es zu hängen, der Rest des C-Programms läuft nämlich wie es soll.

    Code
    Permission denied, please try again.
    Permission denied, please try again.
    pi@192.168.0.80: Permission denied (publickey,password).

    Der SSH Zugriff erfolgt ohne Passwort über einen public key. Das Programm wird im Autostart als root ausgeführt, der key ist aber für den user pi angelegt. Ich könnte mir vorstellen, dass das das Problem ist.

    Jetzt stellt sich natürlich dann die Frage: Wie lösen?:conf:;)

    Hat jemand eine Idee?

    Grüße und Danke

  • Ich rufe per SSH auf einem anderen Pi ein Script auf

    Ist das eine neue Info oder habe ich das überlesen? :conf:

    Jetzt stellt sich natürlich dann die Frage: Wie lösen?

    Dann starte das ganze doch mal als pi! Möglichkeiten gibt es ja nicht nur eine. Z.B. kann man das per Cronjob oder mit einer Systemd Unit.

  • Ist das eine neue Info oder habe ich das überlesen? :conf:

    Ja das ist eine neue Info. Anfangs dachte ich noch, dass es nur am Aufruf des Scriptes liegen würde.. Schande über mein Haupt;)

    Mein Versuch eines "su pi -c" im rc.local zielte auch darauf ab, war allerdings nicht von Erfolg gekrönt.

    Systemd scheint soweit zu funktionieren!

    Hätte ich Schlauberger mal am Anfang das ganze Problem beschrieben, wäre die Sache schnell erledigt gewesen... Besten Dank für die Hilfe!:danke_ATDE:

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!