expertenaustausch > comp.os.* > comp.os.unix.shell

Thomas Schmidt (21.04.2006, 10:45)
Hallo,

Ich würde mich gerne immer am dritten freitag
im monat an etwas errinnern lassen.

Meine erste idee war dies mit cron zu erledigen,
aber mit dem cron welche ich verwende geht nur "jeder" freitag.

Ich dachte mir dann werde ich einfach jeden
freitag per cron ein script aufrufen, welches
überprüft, ob schon der der dritte freitag ist.

GNU date kann ja sowas:
date --date "next friday"
Fri Apr 21 00:00:00 CEST 2006

Wie kann ich gnu date möglichst elegant sowas wie
date --date "third friday of this month"
mache ?

gruss: tom
H. Pophal (21.04.2006, 11:26)
Thomas Schmidt wrote:
> Hallo,
> Ich würde mich gerne immer am dritten freitag
> im monat an etwas errinnern lassen.
> Meine erste idee war dies mit cron zu erledigen,
> aber mit dem cron welche ich verwende geht nur "jeder" freitag.
> Ich dachte mir dann werde ich einfach jeden
> freitag per cron ein script aufrufen, welches
> überprüft, ob schon der der dritte freitag ist.


Genau. Und im script testest du, ob `date +%d` zwischen 15 und 21 liegt,
einschließlich.

Herbert
Juergen Ilse (21.04.2006, 15:30)
Hallo,

Thomas Schmidt <news> wrote:
> Ich würde mich gerne immer am dritten freitag
> im monat an etwas errinnern lassen.
> Meine erste idee war dies mit cron zu erledigen,
> aber mit dem cron welche ich verwende geht nur "jeder" freitag.


Richtig, und wenn das script, dass jeden Freitag ausgefuehrt wird,
ueberprueft, ob es ein "dritter Freitag des Monats" ist, und sich
ansonsten sofortt wieder beendet, waere das die Loesung fuer dein
Problem, nicht wahr? Fehlt also nur noch die Bedingung, welcher
Freitag denn der dritte im Monat ist ...
Die kombination der Bedingungen "ist Freitag" und "ist zwischen dem
15. und 21. des Monats" waere nun genau das, was du suchst. "Freitag"
wird bereits dadurch sichergestellt, dass das script von cron nur
an Freitagn gestartet wird, es fehlt also nur noch etwas wie:

"Datum zwischen 15. und 21.?" --> weitermachen
sonst --> beenden

Das umzusetzen ueberlasse ich dir mal als Uebung ("date" mit
passenden Parametern aufrufen und die Ausgabe pruefen sollte
nicht zu schwer sein). Wenn du diese Sequenz dann am Anfang
in dein script einbaust, hast du dein Problem geloest.

> Ich dachte mir dann werde ich einfach jeden
> freitag per cron ein script aufrufen, welches
> überprüft, ob schon der der dritte freitag ist.


Richtig.

> GNU date kann ja sowas:
> date --date "next friday"
> Fri Apr 21 00:00:00 CEST 2006


Du brauchst dazu diese "Sonderfeatures" von Gnu-date *nicht*.

> Wie kann ich gnu date möglichst elegant sowas wie
> date --date "third friday of this month"
> mache ?


Siehe oben: Das Freitag ist, weisst du ohnehin schon, wenn dein
script nur am Freitag gestartet wird. Zu pruefen bleibt nur noch,
ob es wirklich der dritte Freitag im Monat ist, und das ist genau
dann der Fall, wenn das Datum zwischen dem 15. und 21. (einschliess-
lich) liegt, nicht wahr?

Tschuess,
Juergen Ilse (juergen)
Thomas Schmidt (25.04.2006, 16:13)
Danke für die hilfe H. Pophal und Joergen Ilse!


> "Datum zwischen 15. und 21.?" --> weitermachen
> sonst --> beenden


Das ist ja eigentlich so trivial, aber ich bin nicht darauf gekommen.


> Du brauchst dazu diese "Sonderfeatures" von Gnu-date *nicht*.


Doch schon, weil ich schon donnerstags testen möchte
ob morgen der dritte freitag ist:

Die crontab sieht nun so aus:

0 8 * * 4 [ dritter_im_monat "tomorrow" ] && machwas

dritter_im_monat so:

#!/bin/bash
test -z "$*" && WHEN=now || WHEN="$*"
day=$(date --date "$WHEN" "+%d")
if [ "$day" -ge "15" -a "$day" -le "21" ]
then
true
else
false
fi

wo bei man das so noch kürzer und unleserlicher hin bekommt:

[ "$day" -ge "15" -a "$day" -le "21" ] && true || false
H. Pophal (25.04.2006, 17:58)
Thomas Schmidt wrote:
[..]
> fi
> wo bei man das so noch kürzer und unleserlicher hin bekommt:
> [ "$day" -ge "15" -a "$day" -le "21" ] && true || false


Und das bekommt man noch kürzer und unleserlicher hin, indem das "&&
true || false" einfach weggelassen wird. Die [...] liefert ja schon das
richtige Resultat. if <Boolean> then true else false wirkt sowieso eher
albern.
Helmut Hullen (08.06.2006, 11:36)
Hallo, Thomas,

Du (news) meintest am 08.06.06:

> theoretisch sollte auch sowas im crontab gehen:


> 0 8 15-21 * fri tuwas


In "/etc/crontab" sollte möglichst niemand eigene Jobs eintragen: das
gehört (bei Vixie-Cron) nach /var/spool/cron/tabs/<user>

> In worten: um 8:00 started "tuwas" wenn
> day of month zwischen 15 und 21 liegt UND freitag ist ("fir")
> (man darf für "day of week" auch mon, ... , fri, sat, ... schreiben
> statt 0-7)


> Komischerweise wird das aber mit ODER verknüpft,
> d.h. "tuwas" wird gestated wenn 15-21 und-oder wenn freitag ist.


Was ist daran komisch? So steht das u.a. in der "man page".

Viele Grüße!
Helmut
H. Pophal (08.06.2006, 11:39)
Thomas Schmidt wrote:
> Hallo nochmal,
> theoretisch sollte auch sowas im crontab gehen:
> 0 8 15-21 * fri tuwas


Geht schon, macht aber nicht, was du möchtest.

> In worten: um 8:00 started "tuwas" wenn
> day of month zwischen 15 und 21 liegt UND freitag ist ("fir")
> (man darf für "day of week" auch mon, ... , fri, sat, ... schreiben statt 0-7)
> Komischerweise wird das aber mit ODER verknüpft,
> d.h. "tuwas" wird gestated wenn 15-21 und-oder wenn freitag ist.


Das ist nicht komisch, sondern steht genau so in der manpage von crontab(5).

| Note: The day of a command’s execution can be specified by two fields
| — day of month, and day of week. If both fields are restricted (ie,
| aren’t *), the command will be run when either field matches the cur-
| rent time. For example,
| ‘‘30 4 1,15 * 5’’ would cause a command to be run at 4:30 am on the
| 1st and 15th of each month, plus every Friday.

> Kann man dem cron beibringen das richtige zu tun ?


Definiere: richtig. Schreibe einen patch für cron, der das tut, was du
willst, und der sich z.B. per configure-Option anschalten lässt.
[..]
Heike C. Zimmerer (08.06.2006, 11:50)
Thomas Schmidt <news> writes:

> theoretisch sollte auch sowas im crontab gehen:
> 0 8 15-21 * fri tuwas
> In worten: um 8:00 started "tuwas" wenn
> day of month zwischen 15 und 21 liegt UND freitag ist ("fir")
> (man darf für "day of week" auch mon, ... , fri, sat, ... schreiben statt 0-7)
> Komischerweise wird das aber mit ODER verknüpft,
> d.h. "tuwas" wird gestated wenn 15-21 und-oder wenn freitag ist.


Das sollte auch theoretisch nicht gehen. Es ist auch nicht
komischer-, sondern normalerweise so, dass mit 'oder' verknüpft wird:

man´5 crontab:

Note: The day of a command?s execution can be specified by two
fields ? day of month, and day of week. If both fields are
restricted (i.e., aren?t *), the command will be run when
either field matches the current time.

> Kann man dem cron beibringen das richtige zu tun ?


Es ist bereits das Richtige, nur eben nicht das, was Du im Moment
suchst. Nimm einfach eine von beiden Bedingungen in die crontab und
bau Dir die andere an den Anfang des Skripts.

Und tu Dir und uns was Gutes (Du liest doch auch nicht rückwärts?) und
schau mal bei vorbei.

[ToFu weggekürzt ]

Gruß,

Heike
Achim Peters (08.06.2006, 12:43)
Heike C. Zimmerer wrote:
> Thomas Schmidt <news> writes:
> Das sollte auch theoretisch nicht gehen. Es ist auch nicht
> komischer-, sondern normalerweise so, dass mit 'oder' verknüpft wird:


Nun ja, wenn bei Minuten die 0 steht und bei Stunden die 8, dann wird
das ja auch nicht ausgelöst, wenn die aktuelle Minute 0 *oder* die
aktuelle Stunde 8 ist, sondern nur bei "und". Gleichermaßen bei Tag des
Monats und Monat - immer "und".

Mein ja nur ...

Bye
Achim
H. Pophal (08.06.2006, 13:03)
Helmut Hullen wrote:
> Hallo, Thomas,
> Du (news) meintest am 08.06.06:
>>theoretisch sollte auch sowas im crontab gehen:
>>0 8 15-21 * fri tuwas

> In "/etc/crontab" sollte möglichst niemand eigene Jobs eintragen: das
> gehört (bei Vixie-Cron) nach /var/spool/cron/tabs/<user>


Bei vixie-cron ist das genau das Format von /var/spool/cron/... In
/etc/crontab gibt es da ja noch das username field #6 vor dem Kommando.

Herbert
Heike C. Zimmerer (08.06.2006, 13:19)
Achim Peters <achimpeters> writes:

> Heike C. Zimmerer wrote:


> Nun ja, wenn bei Minuten die 0 steht und bei Stunden die 8, dann wird
> das ja auch nicht ausgelöst, wenn die aktuelle Minute 0 *oder* die
> aktuelle Stunde 8 ist, sondern nur bei "und". Gleichermaßen bei Tag
> des Monats und Monat - immer "und".
> Mein ja nur ...


Das hat was für sich, und solche Überlegungen sind schön und gut. Sie
können hier und woanders den Blick in die Man-Page leider regelmäßig
nicht ersetzen.

Das Leben ist hart ...

Gruß,

Heike
Klaus Fischer (08.06.2006, 13:20)
Am 08.06.2006 11:36 schrieb Helmut Hullen:
> Hallo, Thomas,
> Du (news) meintest am 08.06.06:
>> theoretisch sollte auch sowas im crontab gehen:
>> 0 8 15-21 * fri tuwas

> In "/etc/crontab" sollte möglichst niemand eigene Jobs eintragen: das
> gehört (bei Vixie-Cron) nach /var/spool/cron/tabs/<user>


Interessant, das wußte ich bis dato auch nicht. Stimmt das
tatsächlich? Ich dachte der "offzielle" Weg wäre einfach 'crontab -e'
als entsprechender User und gut ist.

Gruss,
Klaus.
Herbert Pophal (08.06.2006, 13:30)
Klaus Fischer wrote:
> Am 08.06.2006 11:36 schrieb Helmut Hullen:
> Interessant, das wußte ich bis dato auch nicht. Stimmt das
> tatsächlich? Ich dachte der "offzielle" Weg wäre einfach 'crontab -e'
> als entsprechender User und gut ist.


Genau, dort macht ja crontab -e seine Einträge: /var/spool/cron/$user
(Pfad ist bei den Unixen/Distris nicht immer der gleiche)

Herbert
Helmut Hullen (08.06.2006, 13:37)
Hallo, Klaus,

Du (usenet-de) meintest am 08.06.06:

>> In "/etc/crontab" sollte möglichst niemand eigene Jobs eintragen:
>> das gehört (bei Vixie-Cron) nach /var/spool/cron/tabs/<user>


> Interessant, das wußte ich bis dato auch nicht. Stimmt das
> tatsächlich? Ich dachte der "offzielle" Weg wäre einfach 'crontab
> -e' als entsprechender User und gut ist.


So isses.
Und dieser Weg (noch etwas besser: crontab -e -u <user>)erzeugt den
zugehörigen Eintrag in /var/spool/cron/tabs/<user>

Viele Grüße!
Helmut
Helmut Hullen (08.06.2006, 13:39)
Hallo, Herbert,

Du (pophal) meintest am 08.06.06:

>> Interessant, das wußte ich bis dato auch nicht. Stimmt das
>> tatsächlich? Ich dachte der "offzielle" Weg wäre einfach 'crontab
>> -e' als entsprechender User und gut ist.


> Genau, dort macht ja crontab -e seine Einträge:
> /var/spool/cron/$user (Pfad ist bei den Unixen/Distris nicht immer
> der gleiche)


Was anscheinend am besten funktioniert: "richtige" Datei in

/var/spool/cron/tab

und symb. Link nach "/var/spool/cron".
Schon umgekehrt macht "cron" (oder "crontab") gelegentlich Murks.

Viele Grüße!
Helmut

Ähnliche Themen