
Ich möchte einen Cron-Befehl schreiben, damit ein Job ausgeführt wirdeinmalzu einem beliebigen Zeitpunkt während der Woche – ist das möglich, ohne dass sich die Crontab selbst ändert? Ich habe überlegt, eine Funktion zu schreiben, die auf der Grundlage eines Zufallszahlengenerators die Aufgabe möglicherweise ausführt oder nicht – aber ich möchte, dass der Befehl auf jeden Fall ausgeführt wird und dass es keine Sekunde in der Woche gibt, die wahrscheinlicher ist als jede andere Sekunde …
Antwort1
Eine schnelle Lösung besteht darin, ein Cron-Skript zu schreiben, das einmal pro Woche aufgerufen wird und sich für eine zufällige Zeit (nicht länger als die Woche) verzögert, bevor die eigentliche Arbeit ausgeführt wird. Verwenden Sie dazu beispielsweise den folgenden Befehl (funktioniert für Bash und Zsh):
sleep $(($RANDOM/32768.*60*24*7))m
Antwort2
Verwenden Sie eine Kombination aus cron
und at
. Ihr Crontab-Skript enthält ungefähr Folgendes:
TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME
Darin /usr/local/bin/scriptfile
befinden sich die Befehle, die Sie ausführen möchten.
Antwort3
Eine schnelle (und schmutzige und SCHLECHTE, siehe Kommentare unten) Lösung für dieses Problem wäre die Erstellung eines Bash-Skripts, das jeden Tag als Cron ausgeführt wird und wie folgt aufgebaut ist:
Dieses Shell-Skript hätte eine Chance von 1/7, Ihren Befehl jeden Tag auszuführen, und würde den Zeitstempel einer Datei jedes Mal aktualisieren, wenn es erfolgreich ausgeführt wird (verwenden Sie dazu „touch“).
Sie müssten lediglich prüfen, ob die Datei älter als 7 Tage ist, um vorher zu entscheiden, ob Sie das Skript ausführen (hier kann „find“ die Aufgabe übernehmen).
Es muss einen besseren Weg geben, aber ich bin zu müde, um ihn zu sehen ^^
aktualisieren: Wie Joe anmerkte, hat dieses Skript einen großen Fehler, da es einige Wochen lang überhaupt nicht ausgeführt werden kann (und dies letztendlich auch tun wird). Sie sollten es daher nicht verwenden, aber ich lasse es als Gegenbeispiel stehen.
Antwort4
Ich habe ein kleines Skript mit dem Namen zusammengestellt weekrand
(ich habe irgendwo online nach Ratschlägen gesucht und vergessen, wo es war), das genau das tut:
#!/bin/bash
FLOOR=1
RANGE=10080 # number of minutes per week
number=0 #initialize
while [ "$number" -le $FLOOR ]
do
number=$RANDOM
let "number %= $RANGE" # Scales $number down within $RANGE.
done
sleep ${number}m
$@
weekrand {some command} {parameters}
Die Ausführung erfolgt also grundsätzlich zufällig {some command}
zwischen {parameters}
0 und 10080 Minuten, also innerhalb einer Woche.
Eine Beispielzeile crontab
, in der es verwendet wird:
0 0 1 * * nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job