Server Start Stopscript Problem

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hi Leute,

    ich hab da ein kleines Problem bei dem Pythonscript welches meinen NAS-Server starten und stoppen soll, wenn wir zu Hause sind oder weg gehen.
    Funktionieren tut das ganze über die Pings unserer Handys. Das Ganze klappt auch schon recht gut.
    Das Problem habe ich morgens. Ab 05:45:00 Uhr soll das Script den Server starten, wenn die Handys im W-LAN verfügbar sind. Es passiert aber nichts.
    Wenn ich die betreffenden Zeilen direkt in der Python Konsole eintrage bekomme ich true geliefert.

    Code
    (now > "05:45:00" and now < "22:00:00" and wDay > "0" and wDay < "6") or (now > "08:30:00" and now < "22:00:00" and (wDay == "0" or wDay == "6"))
    
    
    os.system("ping -c 1 " + ip1) == 0 or os.system("ping -c 1 " + ip2) == 0

    Wenn wir Nachmittags von der Arbeit kommen startet das Script die NAS anstandslos. Auch das Abschalten beim verlassen des W-LANs funktioniert prima.

    Gestartet wurde das Script über "python startStopNAS.py&" in der rc.local

    Heute morgen habe ich es mal gekillt und manuell gestartet, da hat es sofort die NAS gestartet.
    Ich bin doch etwas verwirrt.
    Hat vlt. jemand nen Tipp, wo ich einen logischen Fehler habe? Oder was an der Programmierung nicht stimmt bezüglich des Zeitabgleiches? Was mich nur wundert, ist dass es nach manuellem Start lief.
    Bin neu in Python und hab da noch ein paar Feinheiten aufzuholen.

    Anbei mal der ganze Code:

  • ich kenne mich mit python auch nicht aus, aber wenn ich das richtig sehe machst du einen "Größenvergleich" von 2 Strings und nicht wie du meinst von zwei Uhrzeiten. Ich kann es dir nicht lösen aber ich bin sicher da liegt dein Problem!

    Warum lässt du das mit dem Uhrzeitvergleich nicht sin, stattdessen startest das Skript per cron um 5:45 und beendest es um 22:00 wieder per cron?

    oder du googlst noch mal und findest z.b. so was

    http://www.python-forum.de/viewtopic.php?t=16056&p=110154

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

    Einmal editiert, zuletzt von Lunepi (19. März 2014 um 11:49)

  • Ich verstehe was du meinst mit dem Stringvergleich.
    Habe das in einem Forum gefunden und wohl falsch interpretiert. Werde das ganze wohl nochmla mit den Zeitfunktionen anders umsetzen.
    Auch das mit dem Cron ist natürlich eine Idee. Mir gefällt aber die Idee, alles in dieser einen Datei abzuhandeln und nicht die Stellschrauben an verschiedenen Ecken zu haben :)

  • Hallo,

    ich kenne mich auch nicht mit Python aus.

    Aber ich kann mir auch kaum vorstellen, dass die Eingrenzung der Zeitintervalle per String-Vergleich so funktioniert, wie Du das geskriptet hast.

    Meist muss man dazu irgendwelche Date Manipulation Module verwenden.

    In Perl, was meine Sprache der Wahl ist, würde man da z.B. Date::Calc, Date::Manip o.ä. nehmen.
    Auf CPAN findet man dutzende Date Module.
    Python muss ähliche Bibliotheken auch haben.

    In Perl kann man das aber mit dem Core Perl allein ohne solche Module machen, wenn man (was im Unix-Umfeld Usus ist) in Epoch Seconds rechnet.
    Perl hat dazu die Funktionen localtime und timelocal, während die Funktion time schlicht die Epoch Seconds seit 01.01.1970 00:00:00 ausgibt
    (das Unix-Referenzdatum).
    Man kann sich dann irgendwelche Zeiten durch entsprechende Sekunden-Offsets selbst zusammenbauen.

    Nur als vages Beispiel, wie das Handling wäre.

    Z.B. eine Startzeit:

    Code
    $ perl -MTime::Local -le 'print scalar localtime(timelocal(0,45,5,19,2,14))'
    Wed Mar 19 05:45:00 2014

    dasselbe in Epoch Seconds

    Code
    [fiddle@pabell:~]
    $ perl -MTime::Local -le 'print timelocal(0,45,5,19,2,14)'
    1395204300

    die zweite Zeit als Offset

    Code
    [fiddle@pabell:~]
    $ perl -MTime::Local -le 'print scalar localtime(timelocal(0,45,5,19,2,14)+16*60*60+15*60)'
    Wed Mar 19 22:00:00 2014

    dasselbe in Epoch Seconds

    Code
    [fiddle@pabell:~]
    $ perl -MTime::Local -le 'print timelocal(0,45,5,19,2,14)+16*60*60+15*60'
    1395262800

    Diese Integers lassen sich in den IF Conditinals unkompliziert gegen die aktuellen Epoch Seconds, die time() liefert vergleichen.

    Zugegeben ist das nicht ganz so anschaulich.
    Wenn man's bequemer haben will, sollte man auf ein gängiges Date Calc Modul der favorisierten Sprache zurückgreifen.

  • Ich habe es jetzt angepasst. In der Testumgebung auf meinem Windows Rechner funktionierts.
    Werde es daheim mal auf den Pi laden und dann schauen, was morgen früh passiert :)

    Code
    wDay = time.strftime("%w")
          now = datetime.datetime.now().time()
          if (now > datetime.time(hour=5, minute=45) and now < datetime.time(hour=22) and wDay > "0" and wDay < "6") or \ # wochentags
             (now > datetime.time(hour=8, minute=30) and now < datetime.time(hour=22) and (wDay == "0" or wDay == "6")):  # Wochenende
  • Hab zwar von Python keine Ahnung, aber Google hat mir unter Anderem das hier genannt:

    Python - Das umfassende Handbuch

    Mit der dort beschriebenen struct_time sollten sich aktuelle Stunde, Minute und Sekunde herausfinden und dann mit den festen Grenzwerten (numerisch) vergleichen lassen.

    EDIT: ach, sorry - hast es ja offensichtlich inzwischen bereits selber hingekriegt. Aber vielleicht ist das Online-Buch ja ein andermal nützlich.

    Einmal editiert, zuletzt von Knuffolino (19. März 2014 um 14:39)

  • ja, wenn man mit Objekten arbeitet, macht das immer den besseren Eindruck, weil man weiss, dass das ganze konkret ist.
    So ich habe zum einen die oben gezeigte Änderung vollzogen UND noch einen logischen Fehler gefunden.
    Der Server wird nachts um 0 Uhr automatisch, per Task, heruntergefahren. Dabei ist das Script in der ersten Schleife hängen geblieben, weil dort nicht überprüft wurde, ob der Server "wirklich" noch online ist.
    Aus der Schleife ist der Code ja nur heraus gesprungen, wenn er aufgrund von Abwesenheit der Handys die NAS gestoppt hat. Ich hab da jetzt noch einen Ping auf den Server eingebaut und nun rennt das Ganze.
    Auch heute morgen ist der Server zuverlässig angesprungen.
    Danke für eure Hilfe.
    Wenn jemand an dem ganzen fertigen Code interessiert ist, kann ich den hier nochmal posten.

  • Klar.
    Hier das Script, wie es bei mir aktuell problemlos läuft und seinen Dienst verrichtet.
    Dazu solltest du noch wakeonlan und samba-common installieren.

    Evtl. interessant sind noch die Threads zum Herunterfahren mit net:
    Mit Raspberry Pi Windows PCs herunterfahren
    Pc ausschalten
    Ich hatte mit dem Herunterfahren am Anfang Probleme, wegen den Berechtigungen des Windowsnutzers, weiss aber nicht mehr, was das war. Wenns nicht klappt, kannst du das aber mit ein wenig googlen regeln, das ging bei mir auch :D

    Die Logdatei muss vorher einmal angelegt werden, wenn du die Ereignisse mitloggen willst.
    Das Script ist im Moment auf 2 Handys ausgelegt. Solltest du nur eins benutzen wollen, müssten ein paar kleine Anpassungen / Streichungen im Code vorgenommen werden. Solltest du mehr IPs pingen wollen, müsste man darüber nachdenken, das ganze zu dynamisieren, damit der Code nicht unnötig aufgebläht wird.

    &quot;Code&quot;

    Einmal editiert, zuletzt von DerMega (28. März 2014 um 15:08)

  • Hallo
    Danke für dein Script :) samba und wakeonlan hatte ich schon drauf
    weil ich mir bereits ein einfaches script gebastelt hatte was aber sehr einfach gehalten
    ist.Vielleicht könnte ich dein Script etwas erweitern wie Licht geht an und die Kaffemaschine startet....

    Einmal editiert, zuletzt von inesa394 (29. März 2014 um 19:37)

Jetzt mitmachen!

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