Script alle paar Minuten starten

Lumio

Lumio

Tripel-As
Hallo... ich weiss es hat nicht wirklich was mit einem Script zu tun, aber dennoch...:
Und zwar möchte ich ein Script alle 75 Minuten ausführen lassen.
Code:
*/75 * * * ...
funktioniert aber nicht wirklich. Es wird immer jede volle Stunde ausgeführt.
 
Ichh möchte mal stark anzweifeln, das 75 auch ne gültige Angabe ist...
 
"Würgaround" ohne cron:

Code:
while true; do <script>; sleep 4500; done
 
Äh? ich dachte */75 bedeutet, dass das script alle 75 minuten ausgeführt wird?
 
Code:
man 5 crontab
sagt
Code:
 field          allowed values
              -----          --------------
              minute         0-59
              hour           0-23
              day of month   1-31
              month          1-12 (or names, see below)
              day of week    0-7 (0 or 7 is Sun, or use names)
;)

Dh. entweder gibst du zBsp. die relevanten Uhrzeiten "richtig" von Hand ein. (0 0 * * * ..., 15 1 * * * ...., 30 2 * * * ....usw.) oder (was ich machen würde), benutzt zBsp. aqualungs Workaround.
 
Zuletzt bearbeitet:
Cron ist da tatsächlich stark limitiert. Interessant, das es überhaupt ausgeführt wird, theoretisch hätte ich jetzt auf nie getippt, da die Minuten niemals ein vielfaches von 75 annehmen. Anscheinend nimmt Cron aber auch das 0fache von 75. Zur vollen Stunde sagtest du ja oder?
 
Okay, das wusst ich nicht... dann lass ichs mal auf 45 minuten... das geht auch noch. ansonsten... was wäre dieses aqualungs Workaround?
 
Ja, das was Aqualung eben oben gepostet hat :rolleyes: :

"Würgaround" ohne cron:

Code:
while true; do <script>; sleep 4500; done


Um das, was dein Script machen soll, wickelst du eine Endlosschleife. Am Ende der Schleife "blockierst" du das Ding für 75 Minuten.
 
Alles klar... aber lastet da das system ned aus? oder wie funktioniert das?
 
Ich hätte noch ne andere Idee, bin mir aber nicht sicher, ob da nicht ein Denkfehler drin ist.

Man lasse das Skript alle 15 Minuten laufen (per cron) und prüfe dann innerhalb des Skript den Modulo von 75 Minuten und den Minuten seit 1970 insgesamt. Ist dieser innerhalb einer gewissen Toleranz, wird das Skript dann aufgeführt.

Code:
SECONDS_NOW=$(date +%s)
INTERVAL=$((75 * 60)) # 75 minutes in seconds...

[[ $((INTERVAL % SECONDS_NOW)) -ge 15 ]] && exit 1
# 15 seconds tolerance

Hm, hab ich da einen Denkfehler drin? (Aus der Befürchtung heraus ist die Toleranz auch so "groß".) Eigentlich sollte das mit dem Modulo ja ziemlich genau hinkommen. Hm. Ich lass das einfach mal laufen heute, mal schaun.
 
ich würdeich würde statt 75 minuten mal 1h und 15 versuchen und das in deine crontab eintragen.
 
@Gott_in_schwarz:
Wieso baust du da ne Toleranz rein? Und sollte das wenndann nicht kleinergleich 15 sein, statt groessergleich? Ausserdem würd ich den Modulo umdrehen ;) (SECONDS_NOW % INTERVAL)

@tuxlover:
Das es dann immer um 01:15 Uhr ausgeführt wird?
(Bzw. entsprechend "*/15 */1 * * ...." jede Stunde und alle 15 Minuten?)
;)
 
Wieso baust du da ne Toleranz rein?
Hab ich doch gesagt, weil ich da irgendwie nicht 100% in meinen Gedankengang vertraue. Aber eigentlich sollte das wenn überhaupt auch mit ner wesentlich kleineren Toleranz von 1-2 Sekunden gehen, wenns denn überhaupt geht.

Und sollte das wenndann nicht kleinergleich 15 sein, statt groessergleich?
Nein? Wenn der Modulo größer als die Toleranz ist beendet sich das Skript einfach direkt am Anfang statt durchzulaufen. (Man beachte das "&& exit 1". Wobei man da auch "exit 0" nehmen könnte. Ist ja kein wirklicher Fehler, sondern erwartetes Verhalten..)

Ausserdem würd ich den Modulo umdrehen . (SECONDS_NOW % INTERVAL)
Ups, ja. Durchaus angebracht.
 
Toleranz wegen der Schaltsekunde? ;-)
Der Cronjob müsste aber dann gestartet werden, wenn (SECONDS_NOW % INTERVAL) gerade in dem Intervall liegt, was nicht 0, 15, 30 oder 45 min nach einer vollen Stunde ist. Beziehugnsweise, müsste man die Toleranz gut anpassen.
Man könnte auch 4 Zeilen in die crontab eintragen, sodass es alle 75min läuft und einmal am Tag nur nach 15min Pause.

Edit: Ich bin auch der Meinung von daboss, es müsset -lg heissen, denn das was du angegeben hast ist, bis auf 15sec, immer erfüllt, also ne große Toleranz :-)
 
Zuletzt bearbeitet:
Ich bin auch der Meinung von daboss, es müsset -lg heissen, denn das was du angegeben hast ist, bis auf 15sec, immer erfüllt, also ne große Toleranz :-)
Wenn überhaupt -le. Was wäre "-lg"? "less or greater"? Also ungleich? hihi
Nein, also, wenn der Modulo größer als die Toleranz ist beendet sich das Skript vorzeitig, ich weiß nicht ob dir das eventuell entgangen ist.. Das sollte eigentlich von der Logik her stimmen.

Ich hab mal eine "testsuite" geschrieben :o)
Code:
#!/bin/bash

INTERVAL=$((75 * 60)) # 75 minutes in seconds...
for hours in {0..23}; do
    for mins in 0 15 30 45; do  # every 15 minutes
            timestr=$(printf "Mon Jan 19 %02d:%02d:00 CET 2009" $hours $mins)
            SECONDS=$(date -d "$timestr" +%s)
            [[ $((SECONDS % INTERVAL)) -eq 0 ]] && echo $timestr
            # zero tolerance.
    done
done

Ausgabe:
Code:
Mon Jan 19 00:15:00 CET 2009
Mon Jan 19 01:30:00 CET 2009
Mon Jan 19 02:45:00 CET 2009
Mon Jan 19 04:00:00 CET 2009
Mon Jan 19 05:15:00 CET 2009
Mon Jan 19 06:30:00 CET 2009
Mon Jan 19 07:45:00 CET 2009
Mon Jan 19 09:00:00 CET 2009
Mon Jan 19 10:15:00 CET 2009
Mon Jan 19 11:30:00 CET 2009
Mon Jan 19 12:45:00 CET 2009
Mon Jan 19 14:00:00 CET 2009
Mon Jan 19 15:15:00 CET 2009
Mon Jan 19 16:30:00 CET 2009
Mon Jan 19 17:45:00 CET 2009
Mon Jan 19 19:00:00 CET 2009
Mon Jan 19 20:15:00 CET 2009
Mon Jan 19 21:30:00 CET 2009
Mon Jan 19 22:45:00 CET 2009

Sieht eigentlich richtig aus. :)
 

Ähnliche Themen

systemd service mit Bash Script und Subshell in einer tmux Umgebung

Shell script will nicht richtig laufen in einem cronjob

chown Befehl in einem Script

Script pausieren bis Bedingung erfüllt ist

batch script funktioniert nicht ...brauche hilfe

Zurück
Oben