Whenever: Tag bei monatlichen Jobs angeben

Erstellt am 18. Juni 2009  ·  13Kommentare  ·  Quelle: javan/whenever

Als ich versuchte, mit einem monatlichen Cronjob eine Zeit einzustellen, musste ich '1.month' verwenden.
Dadurch wurde aber am heutigen Tag für jeden Monat ein Cronjob erstellt, zB.

0 9 18 * * ..... statt
0 9 1 * * ..... was am ersten Tag des Monats ausgelöst würde...

Hilfreichster Kommentar

Wenn Sie nicht das vollständige Datum angeben möchten, können Sie Folgendes versuchen:

jeden 1.Monat, :at => "Monatsbeginn um 9 Uhr"
Dadurch wird das beabsichtigte "0 9 1 * *" erzeugt. Es wird auch Ihren Code ein wenig sauberer halten :)

Ich hoffe, das hilft.

-AP

Alle 13 Kommentare

zeigst du dort die gesamte cron-Ausgabe? Ihr erstes Beispiel hat eine 9 an der Stundenstelle und eine 18 am Tag.

 # .---------------- Minute (0 - 59) 
 # | .------------- Stunde (0 - 23)
 # | | .------------ Tag des Monats (1 - 31)
 # | | | .------ Monat (1 - 12) ODER Jan,Feb,Mär,Apr ... 
 # | | | | .---- Wochentag (0 - 6) (Sonntag=0 oder 7) ODER So,Mo,Di,Mi,Do,Fr,Sa 
 # | | | | |
 # * * * * * auszuführender Befehl

nein, die komplette Ausgabe war:

0 9 18 * * command

können Sie Ihre Datei schedule.rb einfügen? etwas scheint aus.

every 1.month, :at => "9 AM" do
  command "..."
end

Ah, ich sehe das Problem (außer dass ich keine guten Dokumente in diesem Bereich habe). Wenn Sie :at mit 1.Monat verwenden, werden Tag, Stunde und Minute aus der Uhrzeit geparst. Wenn Sie also nur eine Zeit wie 9 Uhr morgens verwenden, wird davon ausgegangen, dass der Tag, den Sie meinen, heute ist.

Eine Möglichkeit, dies zu korrigieren, besteht darin, ihm ein vollständiges Datum zu geben. Ich gebe zu, dass das hässlich aussieht, aber es sollte funktionieren: jeden 1. Monat, :at => "01. Januar 9 Uhr"

Es wird den "Januar" ignorieren, aber es ist für eine erfolgreiche Analyse notwendig (wenn Sie den Chronic-Gem zum Parsen von Datum und Uhrzeit verwenden).

Ich hoffe, das hilft.

das

Wenn Sie nicht das vollständige Datum angeben möchten, können Sie Folgendes versuchen:

jeden 1.Monat, :at => "Monatsbeginn um 9 Uhr"
Dadurch wird das beabsichtigte "0 9 1 * *" erzeugt. Es wird auch Ihren Code ein wenig sauberer halten :)

Ich hoffe, das hilft.

-AP

Danke Javan.

Wie gesagt, das sieht nicht gut aus, aber es funktioniert!

tsommer ... die obige Lösung, die ich gepostet habe, sollte funktionieren. Ich bin mir nicht sicher, ob du es dir angesehen hast.

„Monatsbeginn um 9 Uhr“ – das gilt! Danke.

Ich muss diesen Cronjob "0 0 27-31 * *" ausdrücken. Ist das mit der aktuellen Syntax möglich?

Vielleicht wäre es besser, eine andere Methode in der DSL bereitzustellen, um Cron-Jobs in der normalen Cron-Syntax zu übergeben, etwa:

 cron "0 0 27-31 * *" do
 # ...
 Ende

Ich stimme zu, dass eine rohe Syntaxoption schön wäre (Patches willkommen!). In der Zwischenzeit können Sie dies mit einer Prise Ruby tun.

every 1.month, :at => (27..31).to_a.map { |d| "12am January #{d}" } do
  command "..."
end

Javan danke für die schnelle Antwort.
Aktuell verwende ich folgenden Patch. Vielleicht könnte die Regexp einige Verbesserungen brauchen, aber jetzt funktioniert es für mich.

 class Wann immer::Ausgabe::Cron
 CRON_EXP = /[^\s]+\s[^\s+]\s[^\s]+\s[^\s]+\s[^\s]+/

 def time_in_cron_syntax
 Fall @time
 wenn CRON_EXP dann @time
 wenn Symbol dann parse_symbol
 Wenn String dann parse_as_string
 sonst parse_time
 Ende
 Ende
 Ende

Dann kann ich machen:

 alle '0 0 27-31 * *' tun
 ...
 Ende

Wie erstelle ich alle 2 Monate, Ende des Tages (31.), 11 59 Uhr cron?
jeden 2. Monat, bei 59 11 L * 0

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

zsherman picture zsherman  ·  17Kommentare

anthonydahanne picture anthonydahanne  ·  11Kommentare

kovalevsky picture kovalevsky  ·  5Kommentare

lgs picture lgs  ·  6Kommentare

ringe picture ringe  ·  13Kommentare