2010-07-13 9 views
41

Ich benutze Bash auf RedHat. Ich muss einen Cron-Job planen, um um 9:00 Uhr am ersten Sonntag jedes Monats zu laufen. Ich habe ein wenig recherchiert und gesehen, dass es keine kurze Hand in Cron gibt.Wie planen, um den ersten Sonntag jedes Monats zu starten

Kennen Sie einen optimalen Weg?

+3

Sie könnten Ergebnisse erhalten, diese Frage auf serverfault.com veröffentlichen. –

Antwort

113

Sie so etwas in der crontab Datei setzen können:

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script 

Die date +%d gibt Ihnen die Nummer des aktuellen Tages, und dann können Sie prüfen, ob der Tag als weniger oder gleich 7. Wenn Es ist, führen Sie Ihren Befehl.

Wenn Sie dieses Skript nur an Sonntagen ausführen, bedeutet dies, dass es nur am ersten Sonntag des Monats ausgeführt wird.

Denken Sie daran, dass in der Datei crontab die Formatierungsoptionen für den Befehl date maskiert werden sollten.

+2

Dies ist eine ausgezeichnete Lösung. Sie müssen nicht Ihr Programm bearbeiten, können nur diesen Hack in Cron-Eintrag und erreichen die Anforderung. – thegeek

+1

sollte dies die beste Antwort sein. – clopez

+0

das ist genial wo ist dieses '-le' Zeug dokumentiert? Ich muss das gleiche für 1. Sonntag, 2. Sonntag 3. Sonntag 4. Sonntag und (vielleicht) 5. Sonntag ... tun. –

1

vielleicht cron.hourly verwenden, um ein anderes Skript aufzurufen. Dieses Skript überprüft dann, ob es der erste Sonntag des Monats und 9 Uhr morgens ist, und wenn ja, führe dein Programm aus. Klingt optimal genug für mich :-).

+4

Außer man könnte es auch täglich nennen: Es ist eine wenig bekannte Tatsache, dass sich der Tag einmal am Tag ändert. ;) – Isaac

+0

er sagte 9 Uhr obwohl – gtrak

+0

Danke für Ihre Antwort Obwohl keine große Sache, warum ein Skript jede Stunde zu laufen? Ich suche eher ein wöchentliches Skript, das jeden Sonntag läuft. Aber frage mich, ob jemand schon etwas ähnliches getan hat. –

6

A hacky Lösung: haben Ihre Cron-Job jeden Sonntag laufen, haben aber Ihr Skript das Datum zu überprüfen, wie es beginnt, und verlassen sofort, wenn der Tag des Monats ist> 7 ...

+0

Ja, ich habe nur ungefähr dasselbe vorgeschlagen. Ich bin mir nicht sicher, wieso du dafür abgestimmt wurdest ... –

+0

Klingt gut - ich habe eine eher beschreibende Antwort gewählt. –

+0

Ich gebe zu, dass die Punkte zur vollsten Antwort gehen sollten. Ich bin froh, meinen Downvote verloren zu haben: D – thesunneversets

12

Sie müssen kombinieren zwei Ansätze:

a) Verwenden Sie cron, um jeden Sonntag um 9:00 Uhr einen Job auszuführen.

00 09 * * 7  /usr/local/bin/once_a_week 

b) Zu Beginn der once_a_week berechne das Datum und extrahiert, den Tag des Monats über Shell, Python, C/C++, ... und Test, der in 1 bis einschließlich 7 ist. Wenn ja, führe das echte Skript aus; Wenn nicht, beenden Sie still.

+1

Beide arbeiten als 'man 5 crontab' sagt das darüber' Tag der Woche 0-7 (0 oder 7 ist Sun, oder benutze Namen) ' –

+1

Ihr Recht, ich hatte den Mann überprüft Crontab (was nicht viel sagt), aber nicht Man 5 Crontab, was erklärt, dass sowohl 0 als auch 7 als Sonntag gezählt werden. –

1

Wenn Sie nicht möchten, dass Cron Ihren Job jeden Tag oder jeden Sonntag ausführt, können Sie einen Wrapper schreiben, der Ihren Code ausführt, den nächsten ersten Sonntag ermittelt und sich an diesem Datum selbst plant.

Planen Sie dann diesen Wrapper für den nächsten ersten Sonntag des Monats. Danach wird alles selbst erledigt.

Der Code würde so etwas wie (Betonung auf etwas ... kein Fehler gemacht Prüfung) sein:

#! /bin/bash 
#We run your code first 
/path/to/your/code 
#now we find the next day we want to run 
nskip=28 #the number of days we want to check into the future 
curr_month=`date +"%m"` 
new_month=`date --date='$nskip days' +"%m"` 
if [[ curr_month = new_month ]] 
then 
((nskip+=7)) 
fi 
date=`date --date='$nskip days' +"09:00AM %D` #you may need to change the format if you use another scheduler 
#schedule the job using "at" 
at -m $date < /path/to/wrapper/code 

Die Logik ist einfach den nächsten ersten Sonntag zu finden. Da wir am ersten Sonntag des aktuellen Monats beginnen, wird durch Hinzufügen von 28 entweder der letzte Sonntag des aktuellen Monats oder der erste Sonntag des nächsten Monats angezeigt. Wenn es sich um den aktuellen Monat handelt, erhöhen wir auf den nächsten Sonntag (der in der ersten Woche des nächsten Monats liegt).

Und ich habe "at" verwendet. Ich weiß nicht, ob das Betrug ist. Die Hauptidee ist jedoch, den nächsten ersten Sonntag zu finden. Sie können den gewünschten Scheduler danach ersetzen, da Sie das Datum und die Uhrzeit kennen, zu der Sie den Job ausführen möchten (ein anderer Scheduler benötigt möglicherweise eine andere Syntax für das Datum).

-2

00 09 1-7 * 0/usr/local/bin/once_a_week

jeden Sonntag von ersten 7 Tagen des Monats

+6

Sorry, dieses wird tatsächlich jeden Sonntag und die ersten 7 Tage des Monats arbeiten. Siehe hier: http://StackOverflow.com/a/6203414/327064 – ak112358

5

Dies auch mit den Namen der Wochentage arbeitet:

0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh 

Aber

[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY

Willen FAIL auf comandline durch spezielle Behandlung von "%" in crontab (gilt auch für https://stackoverflow.com/a/3242169/2919695)

+1

Dies ist ähnlich wie oben, aber ich mag es besser für die Lesbarkeit. –

+0

Dies sollte die richtige Antwort sein, was ich sagen würde ist, dass der zweite Teil der maniac_ Antwort sagt: "aber .. wird scheitern" alles, was er bedeutet ist, wird es in CMD auf BASH scheitern, aber nicht scheitern, wenn es eine Crontab ist –

5

einen Montag Crontask 1. Lauf, 3. Dienstag, letzten Sonntag, alles ..

http://xr09.github.io/cron-last-sunday/

Setzen Sie einfach das run-if-today Skript in den Pfad und verwenden Sie es mit Cron.

30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh 

Das run-if-today Skript wird wieder nur 0 (bash Wert für True), wenn es der richtige Zeitpunkt.

EDIT:

Jetzt mit einfacher Schnittstelle, nur einen Parameter für Woche Nummer.

# run every first saturday 
30 6 * * 6 root run-if-today 1 && /root/myfirstsaturdaybackup.sh 

# run every last sunday 
30 6 * * 7 root run-if-today L && /root/lastsunday.sh 
+1

Hoffnung es funktioniert, weil ich mich jetzt darauf verlasse :) – Dennis

+0

@Dennis Go for it, jedes Problem melden Sie einfach ein neues Problem. Schön, dass es hilft. :) –

Verwandte Themen