Geplante Aufgaben (cronjob) kennt kein sleep? Webhosting Spezial 100

  • Hallo!


    Ich habe eine einfache Frage. Ich habe einen trivialen Shellscript, bestehend aus vier cp Kommandos über die Oberfläche als stündliche Aufgabe eingestellt. Soweit so gut. Da der Job in der Sekunde 0 los läuft kollidiert er mit mit einem FTP der minütlich von meiner Webcam Bilder auf den FTP legt. (Genau diese Bilder sollen kopiert werden). Das würde ich einfach dadurch lösen, das ich in der geplanten Aufgabe ein sleep 20 vor den cp Kommandos einfügen würden, Leider kennt die Shell in der der cronjob ausgeführt wird (wie auch die ssh Shell) kein sleep.


    Gibt es da ein Trick oder Workaround? Ich könnte natürlich eine while schleife bauen die mit date %S auf die 20 Sekunde wartet, aber selbst dort würde gerne etwas in den body schreiben..


    Irgend eine Idee, Tipp, Hinweis?


    Danke! Viele Grüße Claus-Peter

  • Statt da eine schöne Race-Condition zu bauen, könntest du dir merken welche Bilder schon kopiert wurden (oder kopierte löschen) und alle anderen rüberkopieren. So kopierst du im Zweifel erst eine Minute später, aber das Verfahren derzeit klingt auch nicht sonderlich zeitkritisch...

  • Hi Hecke29,


    danke für den Input. Ich kann leider nicht feststellen ob die Bilder fertig kopiert sind, da die von extern kommen und sich immer überschreiben (Gleicher Dateiname). Da die Webcams alle Minute übertragen, bringt die Verschiebung um eine Minute auch keine Verbesserung. Die Webcams kann ich leider auch nicht skripten oder verzögern. Ich kann nur auf dem Server was machen.


    Viele Grüße Claus-Peter

  • Oder mit dem find-Befehl und der mtime spielen. Sprich: Nur kopieren, was älter als x Minuten ist.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Danke für Eure Ideen!


    inotify kenne ich noch nicht -> werde ich mir ansehen.

    Über find und mtime habe ich auch schon nachgedacht, klappt aber nicht. Die vier Quellbilder sind ja maximal 1 Minute alt und werden zur Sekunde 0 neu (über-) geschrieben. Ich habe jetzt mal die while Schleife mit 5 Sekunden eingebaut. Zumindest die letzten zwei Aufrufe hatten komplette Bilder (und nicht nur den Anfang) .

  • Gibts eigentlich ein Grund warum es kein sleep gibt?


    Naja.. primär sind die Webhosting-Pakete für's Hosting von Webseiten gedacht + E-Mail. ;)

    Die kleine Shellumgebung mit ausgewählten Befehlen sehe ich da eher als Zusatz-Gimmick. Für den vollständigen Befehlssatz wirst du wohl auf einen kleinen VPS und eigener OS-Verwaltung ausweichen müssen.

    Eine weitere Idee wäre dein Vorhaben mit PHP, Perl, Python etc (je nachdem was bei dir zur Verfügung steht) umzusetzen - aber inwieweit es hier ebenfalls Einschränkungen im stark eingeschränkten 100er Webhosting gibt kann ich leider nicht beurteilen.


    Gruß

    René

  • Naja.. primär sind die Webhosting-Pakete für's Hosting von Webseiten gedacht + E-Mail. ;) Die kleine Shellumgebung mit ausgewählten Befehlen sehe ich da eher als Zusatz-Gimmick.

    Hi Rene, da hast Du wohl recht. Ich brauch es eigentlich auch nur für die eMail (Domain) und etwas statischen Webspace. Aber seit ich die Gimmicks entdeckt habe experimentiere ich ein wenig damit rum und freue mich über die kleinen Verbesserungen mit ein paar Zeilen php oder hier mit dem kleinem cronjob. Der übrigens jetzt problemlos klappt mit seinem "laufe nicht vor Sekunde 05"!


    Insgesamt habe ich den Wechsel vom Provider mit der zwei Buchstabendomain zu netcup nicht bereut. Hier bekomme ich für kleines Geld viel mehr und auch die Gimmicks von denen ich dachte, dass ich sie nicht brauche ;)


    Schönen Restsonntag an alle, CPM

  • Über find und mtime habe ich auch schon nachgedacht, klappt aber nicht. Die vier Quellbilder sind ja maximal 1 Minute alt und werden zur Sekunde 0 neu (über-) geschrieben.

    Ok, das habe ich dann falsch verstanden, mein Fehler.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Ist lang her, aber da ich jetzt ein Lösung gefunden habe, möchte ich sie auch nochmal kundtun. Der Trick ist von einem file descriptor mit Timeout zu lesen. Damit warte ich nicht mehr aktiv.


    #!/bin/bash

    #

    #

    a=`date +%S`

    while [ $a -lt 30 ]

    do

    a=`date +%S`

    read -t 2 -i 1

    done


    Damit wird der nachfolgende Code erst ab Sekunde 30 ausgeführt.

  • Ich mag kurz klugscheissen:

    Bitte keine Backticks verwenden, besser ist "$(date +%S)" zur Command Substitution zu verwenden sowie auch "[[" anstatt "[", also:

    Code
    #!/usr/bin/env bash
    
    a=$(date +%S)
    
    while [[ "$a" -lt 30 ]]; do
    
        a=$(date +%S)
        read -t 2 -i 1
    done
  • Hay,


    leider sehe ich den Beitrag jetzt erst :D


    Warum macht Ihr es Euch so kompliziert... im CLI gibt es doch auch PHP... wenn man nicht schon das komplette Skriptlein in PHP schreiben möchte, kann man sich sein sleep wenigstens in PHP schreiben...


    PHP
    #!/bin/php
    <?php
    sleep($argv[1]);
    ?>

    und dann im bash-Script an die passende Stelle einfach ein /path-to/sleep.php 30.



    Wir haben ein bingo!


    CU, Peter

    Peter Kleemann // https://www.pkleemann.de // +49 621 1806222-0 // Kann Programme, Internet, Netzwerke und Telefon.