Scheduler mittels Shell-Skript

vorhergehende Artikel in: Linux
23.11.2014

In einem früheren Artikel beschrieb ich einen leichtgewichtigen Terminkalender, der nichts anderes tat, als EMails zu versenden. Ich habe diese Idee aufgegriffen und ein wenig erweitert - nun startet die Lösung beliebige Tasks zu definierten Zeitpunkten

Ich habe den Aufgabenbereich weiter gefasst: die Lösung sollte mich nicht mehr nur an Termine per EMail erinnern, sie sollte vielmehr auch Aufgaben selbstständig abarbeiten. Cron konnte ich dazu nicht benutzen, da man damit einmalige Aufgaben nur für maxinmal ein Jahr im voraus einplanen kann.

Ich setzte mich also wieder hin - ein guter Bekannter pflegt zu sagen: "Erst muß der Plan fertig sein!" - und definierte meine Ansprüche erneut:

  1. Sie sollte schlank sein - kein Server, keine Datenbank oder ähnliches
  2. Beim Login sollte jeden Tag geprüft werden, welche Aufgaben an diesem Tag anliegen.
  3. Werden welche gefunden, werden sie ausgeführt
  4. Beim zweiten oder dritten Login soll diese Prüfung nicht mehr stattfinden
  5. Es soll möglich sein, die Aufgaben auch jährlich, monatlich oder täglich zu wiederholen.
  6. Die Aufgaben sind ausführbare Dateien - also zum Beispiel Skripts - damit ist die ursprüngliche Zielstellung - das Versenden von Mails ebenfalls möglich
  7. Die Ausgaben der ausführbaren Programme sollen in Logdateien gespeochert werden
Lassen sich diese Anforderungen erfüllen? Erstaunlicherweise ja - mittels eines Linux-Shell-Skriptes.

Am Anfang des Skriptes wird das Datenverzeichnis festgelegt

Zunächst testet das Skript, ob eine Datei . im Homeverzeichnis des Nutzers vom aktuellen Tag stammt. Ist das der Fall, beendet es sich sofort. Das verhindert mehrmaliges Ausführen der Aufgaben an ein und demselben Tag.

Anschließend wird im Datenverzeichnis nach Verzeichnissen gesucht, die entweder das aktuelle Jahr oder "forever" als Namen tragen. Falls solche Verzeichnisse gefunden werden, wird in sie gewechselt.

Im Jahresverzeichnis wird nach Verzeichnissen gesucht, die entweder die Nummer des aktuellen Monats (immer zweistellig, gegebenenfalls links mit 0 aufgefüllt) oder "forever" als Namen tragen. Falls solche Verzeichnisse gefunden werden, wird in sie gewechselt.

Im Monatsverzeichnis wird nach Verzeichnissen gesucht, die entweder die Nummer des aktuellen Tages im Monat (immer zweistellig, gegebenenfalls links mit 0 aufgefüllt) oder "forever" als Namen tragen. Falls solche Verzeichnisse gefunden werden, wird in sie gewechselt.

Im Tagesverzeichnis wird nach Dateien gesucht, die ausführbar sind. Werden solche gefunden, wird das aktuelle Verzeichnis auf das Tagesverzeichnis gesetzt und die gefundene Datei ausgeführt. Dabei werden für eine Datei namens XY die Ausgaben auf stdout in XY.output und die Ausgaben auf stderr in XY.error umgeleitet

Als letztes schließlich wird das Modifikationsdatum der Datei . auf den aktuellen Tag gesetzt, um wiederholtes Ausführen innerhalb eines Tages zu verhindern.

Wer dieses Skript ebenfalls einsetzen möchte, muß dazu lediglich das Datenverzeichnis am Beginn des Skripts geeignet definieren.

Lizenz
cal.sh

Artikel, die hierher verlinken

Remind

13.07.2015

Nachdem ich vor einiger Zeit eine eigene, proprietäre Lösung vorgestellt habe, Benachrichtigungen oder Alarme für beliebig weit in der Zukunft liegende Ereignisse zuverlässig auszulösen, fand ich jetzt die Komplettlösung...

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Aviator + Websockets

    15.06.2019

    Nachdem ich in den letzten Wochen und Monaten meine Zeit und Energie in die sQLshell gesteckt habe - was sowohl Bugfixing als auch neue Features betraf - habe ich nun endlich die Zeit gefunden, ein bereits lange überfälliges Feature an dWb+ und speziell am aviator zu implementieren.

    Weiterlesen...

Neueste Artikel

  • Neue Version plantumlinterfaceproxy napkin look

    Es gibt eine neue Version des Projektes plantumlinterfaceproxy - Codename napkin look.

    Weiterlesen...
  • Apache HTTPCore5 funktioniert nicht mit Docker

    Ich habe neulich drei Stunden meines Lebens verschwendet weil ich unbedingt die neueste Version der HTTPCore5 Library von Apache einsetzen wollte.

    Weiterlesen...
  • Entwurfsmodus für beliebige SVG Graphiken

    Nachdem ich in der Vergangenheit immer wieder Weiterentwicklungen der Idee vorgestellt habe, Graphiken mit dem Computer so zu ezeugen dass sie eine gewisse "handgemachte" Anmutung haben, habe ich nunmehr die durchschlagende Idee gehabt:

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.