staging.inyokaproject.org

Prüfen ob der 15. eines Monats nicht auf Samstag oder Sonntag fällt

Status: Gelöst | Ubuntu-Version: Ubuntu 19.04 (Disco Dingo)
Antworten |

thork

Anmeldungsdatum:
17. Februar 2020

Beiträge: Zähle...

Hallo

Ich habe ein Problem wo ich mich im Kreis drehe und auf Hilfe angewiesen bin. Ausgangslage ist, dass ich immer am 15. des Monats einen Job ausführen muss. Sollte der 15. aber auf einen Samstag/Sonntag fallen muss der Job bereits am letztmöglichen Arbeitstag ausgeführt werden. Nachfolgend mal mein Ansatz mit if statements, aber das ist nicht wirklich Zielführend. Immer wieder stehe ich mit meiner Logik irgendwie an und sehe vor lauter Bäume den Wald nicht mehr. Hat jemand da eine Idee wie ich - Shell Dummy - das angehen könnte.

Für Tipps wie ich Vorgehen sollte, besten Dank!

Thork

weekday.sh (549 Bytes)
Script Entwurf
Download weekday.sh

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Hab mir dein Script nun nicht angesehen. Aber dafür kannst du date +'%u' verwenden. Sonntag ist 0.

HaCeMei Team-Icon

Anmeldungsdatum:
2. August 2010

Beiträge: 2269

Wenn ich dein Problem richtig verstanden habe, musst du

* zunächst prüfen, ob der 13., 14. oder 15. eines Monats ist.

* Falls der 13. ist, musst du prüfen ob er auch noch ein Freitag ist, falls ja: Skript ausführen, falls nein: nichts tun.

* Falls der 14. ist, dasselbe wie am 13.

* Falls der 15. ist, prüfen ob Samstag oder Sonntag ist, falls ja: nichts tun, falls nein: Skript starten.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Ich würde das (falls man ohne Berücksichtigung von Feiertagen auskommt) mit einem Systemd Timer (vgl. systemd/Timer Units, https://www.freedesktop.org/software/systemd/man/systemd.timer.html und https://www.freedesktop.org/software/systemd/man/systemd.time.html) machen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=Job am 15. des Monats Mittags ausführen, wenn er auf einen Wochentag fällt, ansonsten am Freitag davor

[Timer]
OnCalendar=Mon..Fri *-*-15 12:00:00
OnCalendar=Fri *-*-14 12:00:00
OnCalendar=Fri *-*-13 12:00:00
Unit=name_der_zu_startenden_unit.service

[Install]
WantedBy=multi-user.target

thork

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 4

Hallo

Besten Dank euch dreien. Deine Antwort HaCeMei trifft den Nagel auf den Kopf. Damit hast Du mir den Weg verständlich aufgezeigt, hätte ich das besser analysiert und erst mal aufgeschrieben, wäre ich wohl weitergekommen. Den Ansatz von seehawk1986 verstehe ich noch nicht, tönt aber sehr interessant. Muss ich mich jedenfalls schlau machen.

Nochmals besten Dank und Gruss

thork

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Bitte 27 Zeilen Code einfach in einem Codeblock in die Frage posten. Mit Anhängen zu arbeiten ist so unbequem.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
set -x
# Script to check if 15th of a month is not Saturday or Sunday
#
#
#DATETODAY=Friday
DATETODAY=`date +%A`
DATEDD=`date | awk -F" " '{print $3}'`
EXECDAY1="Monday"
EXECDAY2="Tuesday"
EXECDAY3="Wednesday"
EXECDAY4="Thursday"
EXECDAY5="Friday"

echo das ist $DATEDD

#if [[ $DATETODAY == $EXECDAY5 ]]
if [[ $DATETODAY == Friday ]]
        then
                if [[ $DATEDD <= 14 ]]
        then
                echo "execute the script XYZ.sh"

        else
                echo "nix zu tun "
        fi
fi

Die Codeblöcke werden automatisch - ich glaube ab 10 Zeilen - zu Scrollfenstern, so dass auch 300 Zeilen kein Problem sind.

Was ist denn mit Karfreitag?

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

user_unknown schrieb:

Was ist denn mit Karfreitag?

Auch andere Feiertage können im jeweiligen Bundesland auf einen Freitag fallen. Daß Donnerstag + Freitag Feiertage sind, kann praktisch nur in der Weihnachtswoche vorkommen. Dann ist aber Samstag + Sonntag nicht der 15.

Erweiterung der Logik von HaCeMei:

  • Spätestens Anfang Januar die ics-Datei der Feiertage des Bundeslandes unter https://www.schulferien.org/deutschland/ical/ herunterladen und abspeichern (feiertage_yyyy.ics).

  • Als erstes prüfen, ob Donnerstag ist. Falls ja, prüfen, ob morgen der 13. oder der 14. ist.

  • Falls ja, morgiges Datum gegen Feiertagsliste prüfen (Zeile beginnt mit DTSTART und enthält morgiges Datum)

  • Falls enthalten, Job starten. Falls nicht, weiter mit Logik von HaCeMei:

  • zunächst prüfen, ob der 13., 14. oder 15. eines Monats ist.

  • Falls der 13. ist, musst du prüfen ob er auch noch ein Freitag ist, falls ja: Skript ausführen, falls nein: nichts tun.

  • Falls der 14. ist, dasselbe wie am 13.

  • Falls der 15. ist, prüfen ob Samstag oder Sonntag ist, falls ja: nichts tun, falls nein: Skript starten.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

thork schrieb:

Den Ansatz von seehawk1986 verstehe ich noch nicht, tönt aber sehr interessant. Muss ich mich jedenfalls schlau machen.

Das ist einfach eine positiv-Liste - wenn eine der Bedingungen zutrifft, wird die angegebene Systemd-Unit ausgeführt. Die drei OnCalendar Bedingungen sind:

  • Mon..Fri *-*-15 12:00:00 - Wochentag von Montag bis Freitag, 15. des Monats

  • Fri *-*-14 12:00:00 - Wochentag Freitag, 14. des Monats (der 15. wäre ein Samstag)

  • Fri *-*-13 12:00:00 - Wochentag Freitag, 13. des Monats (der 15. wäre ein Sonntag)

Natürlich könnte man sich auch mit einem Kalender hinsetzen und die 12 Startzeitpunkte, die es jedes Jahr gibt, von Hand ermitteln und eintragen - was effizienter ist, hängt davon ab, wie viel Zeit man langfristig sparen kann: https://m.xkcd.com/1205/.

Antworten |