Wie verhindere ich, dass der Schlaf durcheinander kommt?

0

Ich führe zwei Skripte aus. Beide sind im Wesentlichen der gleiche Code, müssen jedoch im Abstand von 5 Minuten ausgeführt werden, um eine Kollision zu vermeiden. Erstes Drehbuch:     #! / bin / sh

# First run
line="Bonus check"
        stamp=$(date +%Y%m%d-%H%M)
      # sleep 90s
        echo "$stamp\t $line" >> /home/rdanner3/Desktop/CardParty.log
        {
export DISPLAY=:0.0
google-chrome [URL masked]
        }
sleep 45s
# google-chrome
pkill -f chrome

# Second run to seventh run identical to above; stripped for brevity.

Zweites Skript (beachten Sie, dass es im Wesentlichen der gleiche Code ist; beide müssen wirklich Schleifen für die Vernunft sein!)

#!/bin/sh

# 1st run
line="Bonus checked."
stamp=$(date +%Y%m%d-%H%M)
# sleep 90s
echo "$stamp\t $line" >> /home/rdanner3/Desktop/Slots.log
{
export DISPLAY=:0.0
google-chrome [URL masked]
}
sleep 45s
# google-chrome
pkill -f chrome

# 2nd run to 7th run identical to above code...stripped for brevity

Was passiert, wenn die Skripte die zweite Ausführung erreichen? Sie laufen innerhalb von Sekunden, obwohl die Cron-Jobs, die sie anfangs starten, 5 Minuten voneinander entfernt sind. Es ist ziemlich offensichtlich (aus den Protokolldateien, die die beiden Skripte schreiben), dass sie nicht in der richtigen Reihenfolge gestartet werden. Würde das Umschalten des zweiten Skripts auf (say) ash oder bash dazu beitragen, dass sich die Sleep-Befehle der beiden Skripts nicht gegenseitig verwirren? Oder mache ich einen anderen Fehler (zum Beispiel muss ich das zweite Mal google-chrome auskommentieren, damit der pkill die Luft reinigt)?

Ich habe das Problem gestern bemerkt und bin zu dem Schluss gekommen, dass ich ein bisschen Hilfe brauche. Also bin ich hergekommen.

Raymond Danner
quelle

Antworten:

2

Der Fehler beruht wahrscheinlich auf dem Schlaf für das absolute Timing anstelle des relativen Timings. Das Zeug vor dem Schlaf kann eine unterschiedliche Zeit in Anspruch nehmen.

Nach dem Entfernen der Code-Wiederholungen würde ich vielleicht verwenden at in einer Schleife oder, wahrscheinlicher, eine differenziertere Verwendung von cron.

Wenn die genauen Startzeiten unwichtig wären, würde ich zwei Funktionen nacheinander in einer einfachen Schleife aufrufen. Beide Skripte kombinieren.

RedGrittyBrick
quelle
Ein Teil des Problems ist, dass cron einfach kein Intervall von 183 Minuten machen kann. Das Intervall ist relativ wichtig für die Funktion der einen Linie, die das schwere Heben ausführt, und aus irgendeinem Grund hat Windows kein Problem damit, diese Art von Intervall auszuführen. Habe ein epochenbasiertes Timing-Schema ausprobiert, aber es hat einfach nicht funktioniert. Seltsamerweise funktionieren die beiden Skripte im Wesentlichen einwandfrei, wenn der zweite Aufruf des Browsers nicht auskommentiert ist. Ich kratzte mich immer noch am Kopf darüber, da der zweite Durchlauf des Browsers ein hässlicher Trick ist.
Raymond Danner
Welche Art von Schleife würden Sie für eine Aufräumnotiz (in Bezug auf den Skriptcode) empfehlen? Ich gebe zu, ich bin ziemlich neu in der Skripterstellung für Linux, obwohl ich Skripten für beide DOS-Versionen durchgearbeitet habe (bis hin zu Apples ProDOS, ob Sie es glauben oder nicht ... gefolgt von PC-DOS und MS- DOS) und Windows.
Raymond Danner
@Raymond. Ich bin nicht sicher, ob ich einen bestimmten Code empfehlen kann, aber wenn Sie eine Ressource wie Bash-Loop-Intro Sie sollten in der Lage sein, ein Konstrukt zu finden, das Ihren Anforderungen entspricht. Vielleicht sowas for url in "http://a.com" "http://b.com"; do google-chrome $url; sleep 45s; done
RedGrittyBrick