Raspberry über Ping-Befehl ausschalten

  • Hallo liebes Forum,

    ich bin neu hier und komm gleich zu meiner Frage.

    Ich möchte meinen Raspberry nicht dauerhaft laufen lassen, da ich diesen nur für RaspBMC nutze.

    Mein Ziel: Ich möchte den Raspi bei nicht-Erreichbarkeit einer IP Adresse herunterfahren lassen.

    Mein Problem: Derzeit mache ich mein Philips TV aus, warte ca. 1 Minute und schalte dann den Strom des Verteilers des TV´s (inkl. Switch, an welchem auch der Raspi hängt) per Stromfunkdose aus. Nur der Raspi läuft dann weiter, derzeit leider dauerhaft. Da der Raspi ja nun leider kein vollwertiges WakeOnLan besitzt, lässt sich dieser zwar per SSH abschalten, aber nicht wieder einschalten.

    Mein Plan: Um nun auch den Raspi automatisch mit aus und anschalten zu können (und nein, ich möchte dem Raspi nicht einfach während des Betriebs den Strom klauen!), habe ich vor, im Hintergrund eine Pingabfrage laufen zu lassen, welche die IP meines TV´s prüft. Sobald diese nicht mehr erreichbar ist, soll sich der Raspi herunterfahren und ich kann kurze Zeit später den Strom abschalten. Anschalten wird er sich dann ja wieder mit dem TV zusammen bei Einschalten des Stroms.

    Unter Windows habe ich das bereits geschafft. Als Grundlage dafür habe ich fix folgenden Script geschrieben:

    Ping -n 1 localhost >NUL
    echo %errorlevel%
    if %errorlevel% == 1 shutdown -r -f

    Nach ein paar Optimierungen wie Pinganzahl sowie bsp. 4maliges Wiederholen der Pinganfrage und natürlich Eingabe der richtigen IP würde mein Rechner herunterfahren, sobald der TV nich mehr erreichbar ist. Das ganze als Endlosschleife in den Autostart gepackt und fertig.

    Nun bin ich allerdings nicht der große Programmierer bei Linux-Shell...könnt ihr mir vielleicht helfen das ganze auf den Raspi zurechtzuschneiden? Und wenn das Script läuft, wie packe ich dies am sinnvollsten in den Autostart des Raspi´s...bzw. kann ich dies ja villeicht auch über RaspBMC Einstellungen machen?

    Wie macht ihr das Ganze denn? Die meisten, mit denen ich gesprochen habe bzw. was man so liest, lassen ihn einfach rund um die Uhr laufen was sich bei meiner Anforderung einfach nicht lohnt.

    Ich hoffe ihr könnt mir helfen, vielen Dank schonmal dafür :s:thumbs1:

    Einmal editiert, zuletzt von redseven (16. August 2014 um 01:22)

  • Hallo und vielen Dank erstmal. Guter Tipp, leider staret Watchdog den Raspi nur neu und fährt ihn nicht herunter...bis jetzt leider keine Möglichkeit zum "poweroff" gefunden :s


  • ..., leider staret Watchdog den Raspi nur neu und fährt ihn nicht herunter...bis jetzt leider keine Möglichkeit zum "poweroff" gefunden :s


    Wo hast Du die Möglichkeit für "poweroff" gesucht? Hast Du den watchdog für die Benutzung deines Scriptes oder deines binary, das "poweroff" (oder gleichwertig) ausführt, konfiguriert?

    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

  • Ich habe ja kein Script der beri Linux funktioniert, ist ja nur mein Windowsscript ;)

    In der watchdog.conf hätte ich den Ping Befehl auskommentiert und die TV IP angegeben. Soweit ich mich belesen habe, macht der Watchdog nur Neustarts. Kann ich dort irgendwo einen Poweroff Befehl eingeben? Mache grad ein Backup des Raspi´s und hab noch nicht Live getestet, die watchdog.conf habe ich mir jedoch angesehen und ich sehe nirgendwo einen reboot Befehl, daher kann ich diesen nicht durch poweroff ersetzen.

    Vor dem Backup habe ich noch diesen Script getestet aber leider klappt es nicht.


    ping -c 1 -w 5 192.168.178.40 &>/dev/null

    if [ $? -ne 0 ] ; then

    echo "test"

    fi


    Leider wird mir kein Echo ausgegeben...ich verstehe den Inhalt des IF-Befehls noch nicht, was muss ich in der eckigen Klammer eingeben damit es läuft?

    Einmal editiert, zuletzt von redseven (16. August 2014 um 15:11)


  • ... und ich sehe nirgendwo einen reboot Befehl, daher kann ich diesen nicht durch poweroff ersetzen.


    Dann siehe z. B. in der manpage, "test-binary" und/oder "test-directory".

    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

  • Leider klappt es mit Watchdog nicht. Selbst wenn ich nur die Standard Sachen aktiviere, wie auch in den TUT´s empfohlen, startet er permanent neu womit ich keine Mögliochkeit mehr habe auf das Gerät zuzugreifen da er nach dem Neustart SOFORT neustartet. Habe jetzt mein Backup wieder eingespielt und habe im Moment wirklich die Nase voll von Watchdog...ich halte an meiner manuellen lösung mit Cronjob fest, vielleicht kann mir jemand helfen und den Script siehe oben zurechtbasteln :helpnew:

    Das ganze dann in den Autostart bzw. Cronjob zu verschieben ist der zweite Schritt.

    Vielen Dank trotzdem bisher!


  • Vor dem Backup habe ich noch diesen Script getestet aber leider klappt es nicht.

    ping -c 1 -w 5 192.168.178.40 &>/dev/null

    if [ $? -ne 0 ] ; then
    echo "test"
    fi


    Versuch mal mit:

    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


  • wundert mich nicht. Du schickst den ping ja in den Hintergrund - also bekommst Du keinen Rückgabewert.

    cu,
    -ds-

    Warum sollte der "ping" in den Hintergrund geschickt werden - es wird ja lediglich die Ausgabe abgeschaltet.
    Es ist soweit also schon richtig.

    Ich würde es der Einfachheit halber so machen:

    Code
    if ping -c1 -w5 192.168.178.40 &>/dev/null; then
      echo 'IP ist online'
    else
      echo 'IP ist offline'
    fi

    Gruß, mmi

  • Ja hey, mmi - wo kommst denn Du her bei dem Sauwetter ;) ...

    Ich kenne das von der shell her so, dass eine Umleitung so
    ping -c 1 -w 5 192.168.178.40 2>&1 >/dev/null
    angegeben wird.
    Wenn aber hinter dem Kommando ein einsames Ampersand steht, wird der Prozess in den Hintergrund geschickt.
    Nachdem Du jetzt auch die mir eher fremde Schreibweise verwendest, muss ja wohl irgendwas dran sein.
    Ich habe das also jetzt mal mit folgendem Ergebnis eruiert:
    In der bash führt
    ping -c 1 -w 5 192.168.178.40 &>/dev/null
    tatsächlich, wie von Euch erwartet, den Befehl im Vordergrund aus.
    In der shell wird das Kommando allerdings, wie ich es mir dachte, in den Hintergrund geschickt.

    Scheint also ein goodie der bash zu sein, wobei ich das eher verwirrend als hilfreich empfinde.

    cheers,
    -ds-

  • Hallo! Leider komm ich erst jetzt zum schreiben. Also ich habe mir nun danke eurer Hilfe folgendfen Script gebastelt:

    -----------------------------------
    while true;
    do

    if ping -c1 -w1 192.168.178.40 > /dev/null; then

    echo "IP ist online"
    sleep 3

    else

    echo "IP ist offline"
    sleep 3
    sudo poweroff
    sleep 10

    fi
    done
    -----------------------------------


    @ dreamshader: Wäre es schlimm wenn der Ping zwei mal ausgeführt wird wie im Script von rpi444? Denn dieser hat ja auch funktioniert.

    Was ich nun noch sehr gerne einbauen würde, ist eine 3malige Wiederholung nach dem Offline Befehl. Sonst würde ja jedesmal, wenn das Ping Signal zum TV mal kurz abreißt, der Raspi herunterfahren. Habt ihr eine Idee wie dies zu machen wäre?

    VIELEN VIELEN DANK NOCHMAL AN ALLE DIE MIR BISHER GEHOLFEN HABEN!
    Wirklich ein TOP Forum :thumbs1:

    lg, redseven

    Einmal editiert, zuletzt von redseven (17. August 2014 um 18:11)

  • Habe eben erst diesen Thread gelesen. Das Problem hatte ich auch mal. Hier ist der download des Scripts. Vielleicht hilft es ja noch jemandem, denn es hat ein paar zusätzliche Features wie Test von mehreren IPs die offline sein müssen, bis das System runtergefahren wird sowie eine Gracetime, so dass das System nicht gleich runtergefahren wird, wenn man mal eben einen Rechner neustartet.


  • Ja hey, mmi - wo kommst denn Du her bei dem Sauwetter ;) ...


    jo siggsdersdennned: - i'm bourne again ... :)


    Ich kenne das von der shell her so ...
    ping -c 1 -w 5 192.168.178.40 2>&1 >/dev/null

    Mit dem Shellargument ist Deine Ehre natürlich gerettet. :thumbs1:
    Ich verwende eigentlich nur noch die Bourne Shell, dann gibt's auch keine Verwirrung. ;)
    Von Performance braucht man beim Scripting ohnehin nicht reden, also kommt's mir auf diese Differenzierung auch nicht mehr an.

    LG mmi


  • Habe eben erst diesen Thread gelesen. Das Problem hatte ich auch mal. Hier ist der download des Scripts. Vielleicht hilft es ja noch jemandem, denn es hat ein paar zusätzliche Features wie Test von mehreren IPs die offline sein müssen, bis das System runtergefahren wird sowie eine Gracetime, so dass das System nicht gleich runtergefahren wird, wenn man mal eben einen Rechner neustartet.

    Hallo :)

    Leider ist mir in diesem Script zuviel, was ich nicht benötige. Trotzdem Danke :thumbs1:

    Ich habe noch einige Zeit probiert, gelesen und getestet und habe nun den für mich perfekten Script gebastelt...es geht sicher auch einfacher aber mit meinen geringen Kenntnissen in Linux-Shell bin ich mehr als zufireden :D Die auskommentierten Echo´s sind für´s testen, hier mein Script:

    -------------------------------------------------------------------------------
    GNU nano 2.2.6 File: /root/tvreboot.sh

    HostIP="192.168.178.21"

    while true;
    do

    if ping -c1 -w1 $HostIP > /dev/null; then

    echo "IP ist online"
    sleep 3

    else

    echo "IP ist offline"


    # zweiter Ping-Versuch
    if echo="IP ist offline";

    sleep 1
    ping -c1 -w1 $HostIP > /dev/null; then
    # echo "IP doch online"
    bash tvreboot.sh

    else

    echo "IP ist immernoch offline"


    fi


    # dritter Ping-Versuch
    if echo="IP ist immernoch offline";

    sleep 1
    ping -c1 -w1 $HostIP > /dev/null; then

    # echo "IP doch online"
    bash tvreboot.sh

    else

    # echo "POWEROFF"
    sudo initctl stop xbmc
    sleep 5
    sudo poweroff


    fi

    exit 0
    fi
    done
    ------------------------------------------------------------------------------------


    Vielen Dank für eure Hilfe, ohne die ich das sicher nicht so hinbekommen hä...vorallem nicht in dieser Zeit :danke_ATDE:

    Einmal editiert, zuletzt von redseven (18. August 2014 um 20:43)

Jetzt mitmachen!

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