/etc/rc.local startet nicht

  • Ich habe ein Shellscript in rc.local eingetragen und erst funktionierte es, dann habe ich etwas an der Datei verändert, war nur ein Kommentar oder so. Jetzt startet das Skript nicht mehr. Wenn ich

    Code
    sudo sh /etc/rc.local

    ausführe, läuft alles ohne Probleme, nur eben beim reboot nicht. Die Datei hat auch Ausführrechte. Was ist hier los und wie kann ich es wieder zum Laufen bringen?


  • dann habe ich etwas an der Datei verändert, war nur ein Kommentar oder so.

    ...oder so? :-/

    Die alller erste Zeile ist kein Kommentar, auch wenn ein # am Anfang der Zeile steht!
    Da es sich um ein Script handelt muss dort auch ein => Shebang <= stehen.

    Wenn ich

    Code
    sudo sh /etc/rc.local

    ausführe, läuft alles ohne Probleme, nur eben beim reboot nicht. Die Datei hat auch Ausführrechte.

    Ich vermute mal dass das nicht funktioniert:

    Code
    sudo /etc/rc.local

    Da du explizit die Datei dem Interpreter übergibst ist das ein Hinweiß für mich das du den wichtigen Shebang entfernt hast - tja, ändert nichts wo ihr euch nicht sicher seid :fies:

    Ohne Shebang weiß das System nicht womit die Datei verarbeitet werden soll. Es ist erst mal nur eine einfache Textdatei der man Ausführrechte gibt - es gibt aber sehr viele verschiedene Interpreter (Verarbeiter), aber die Syntax eines bash Scripts kann nicht von python verarbeitet werden usw. also muss man einen Interpreter explizit in der aller ersten Zeile in einem ganz bestimmten Format angeben => Shebang
    Und nein die Dateiendung sagt auf Konsole Ebende nichts darüber aus womit die Datei verarbeitet werden soll, das dient nur der Übersicht. Erst unter einer GUI kann die Dateiendung (Dateityp) einem Interpreter zugeordnet werden wo dann ein Shebang zweitrangig wäre. Aber zum Beispiel "raspi-config" ist auch ein sh Script ohne Dateiendung, von dessen Sorte es noch etliche mehr auf einem Standard Linux System gibt... sh ist älter als bash und kann nicht so viel.

  • Die vorletzte Zeile hab ich hinzugefügt.

  • Bash
    #!/bin/bash
    ip_address=`hostname -I`
    send_mail $ip_address

    Und /usr/local/bin/send_mail:


    Automatisch zusammengefügt:
    Mit oder so meinte ich: vielleicht war's auch nur ne Leerzeile. Das mit dem Shebang, Interpreter, der Dateiendung usw. weiß ich. Mich hat aber auch gewundert, dass standardmäßig

    Bash
    #!/bin/sh -e

    und nicht

    Bash
    #!/bin/bash

    angegeben ist.
    Automatisch zusammengefügt:
    Und mit

    Code
    sudo /etc/rc.local

    geht es auch.

    Einmal editiert, zuletzt von Coaster-Moritz (1. September 2016 um 16:50)

    • Offizieller Beitrag

    Das wird das leidige Problem der absoluten Pfade sein, bin ich mir ziemlich sicher. ändere mal deine

    Bash
    #!/bin/bash
    ip_address=`hostname -I`
    send_mail $ip_address


    zu

    Bash
    #!/bin/bash
    ip_address=`/bin/hostname -I`
    /wo/auch/immer/die/liegt/send_mail $ip_address
  • Hallo,

    das muss so heißen

    Code
    ip_address=$(/bin/hostname -I)
    /wo/auch/immer/die/liegt/send_mail $ip_address

    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 (1. September 2016 um 17:56)

  • Das ändert leider auch nichts daran, dass das Programm bei einem reboot nicht ausgeführt wird.
    Automatisch zusammengefügt:
    Auch wenn ich das E-Mail Programm

    direkt in rc-local ausführe, kommt keine E-Mail an. Also muss es an diesem Skript liegen und nicht an

    Code
    /home/pi/send_ip_mail:
    #!/bin/bash
    ip_address=$(/bin/hostname -I)
    /usr/local/bin/send_mail $ip_address

    .
    So sehen übrigens grade die beiden Dateien aus. Hier kommt noch

    .

    Einmal editiert, zuletzt von Coaster-Moritz (2. September 2016 um 17:39)


  • So sehen übrigens grade die beiden Dateien aus. Hier kommt noch [code]/etc/rc-local:
    #!/bin/bash -e
    #
    ...

    Die Datei ist rc.local und nicht rc-local und die shebang dieser Datei ist i. d. R. "#!/bin/sh -e" und nicht "#!/bin/bash -e".

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample


  • Das erste war ein Tippfehler hier im Beitrag. Das andere hab ich testweise zu #!/bin/bash -e geändert. Ist im Original schon wieder #!/bin/sh -e.

    Wie sind nach dem reboot, die Ausgaben von:

    Code
    systemctl status rc-local
    systemd-analyze blame


    ?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Ja, mit Jessie wird /etc/rc.local von systemd ausgeführt - relativ spät am Ende. Wenn man daran nicht herum gepfuscht hat dann bleibt das eigentlich auch so.

    Wichtig ist /etc/rc.local nicht zu überschreiben, nicht am Shebang herum zu spielen, nicht die aller letzte Zeile ( exit 0 ) zu verändern und immer absolute/vollständige Pfade zu irgendwelchen Scripts zu verwenden!

    Die Datei muss Ausführrechte besitzen.
    bash ist etwas anderes als sh.
    Das System muss wissen ob die Ausführung erfolgreich (exit 0) oder fehlerhaft (kein exit oder über 0) war.
    Woher soll das System wissen wo "send_ip_mail" oder "send_mail" sich befindet?

    Ein HickHack über 3 verschiedene Dateien hinweg, /etc/rc.local führt /home/pi/send_ip_mail aus und das wiederum führt ein Python Script send_mail aus - ist Quatsch. Wozu solch ein Chaos?
    Du baust dir damit nur unnötige Fehlerquellen ein und weißt jetzt im Grunde überhaupt nicht welches davon streikt.

    Also bitte trage dein "send_email" direkt in /etc/rc.local ein und sorge ebenfalls dafür das dein Script in den Hintergrund geschickt wird damit die Ausführung des /etc/rc.local Scripts nichts blockiert wird - denn aktuell wird gewartet bis "send_ip_mail" beendet wurde.

    Der absolute Pfad zum Interpreter oder allg. Befehlen im PATH ist hier i.d.R. nicht zwingend erforderlich, schadet aber nicht und stellt sicher das es nicht daran scheitert.


    PS:
    FAQ => Nützliche Links / Linksammlung => crontab
    FAQ => Nützliche Links / Linksammlung => Autostart
    RaspberryPI Hosting/Housing [Diskusionen/Fragen]

  • Hallo Meigrafd,

    willkommen im "Club der 10.000"!

    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.

  • Ich habe mal deine BootMail.sh-Lösung ausprobiert und den rc.local Eintrag vor das Python-Skript gesetzt. Wie mein Python-Skript funktioniert deins bei mir auch nur, wenn ich es manuell starte, nicht aber mit rc.local. Ich habe es auch mal testweise in meine user-crontab eingetragen und auch da funktioniert es nicht bei einem reboot. An den Skripten kann es ja dann wohl nicht liegen, oder? Könnte das was mit Benutzern und Rechten zu tun haben, weil ja sowohl crontab als auch rc.local funktionieren, wenn ich ihnen eine simple Aufgabe gebe (z.B. echo "..." >> Datei)? Die Skripte funktionieren an sich auch einwandfrei, nur eben nicht in Kombination mit Autostart.


  • Könnte das was mit Benutzern und Rechten zu tun haben, ...

    Wie sind, wenn es nicht funktioniert, nach einem reboot die Ausgaben von:

    Code
    systemctl status rc-local
    systemd-analyze blame


    ?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

Jetzt mitmachen!

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