bash crontab: wer ist der nächste?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

bash crontab: wer ist der nächste?

Beitrag von mclien » 05.02.2015 16:43:26

Irgendwie stehe ich gerade mangels Programmierwissens voll im Dunkeln.
das Problem: Ich nutze eine altes Toschiba Libretto als Wecker (mit eisfair). Die Distro hat das nette feature mittels ncurses Oberfläche ein crontab zu editieren, genaugenommen ein Vorlage, die dann zur crontab wird. Nett daran ist, dass man die Weckzeiten an-/ausschalten kann. Die Vorlage für die crontab folgt diesem Muster:

Code: Alles auswählen

.....
CRON_14_NAME='So_Frau'
CRON_14_ACTIVE='yes'
CRON_14_TIMES='45 7 * * 7'
CRON_14_COMMAND='/root/play.sh Frau'

CRON_15_NAME='So_mclien'
CRON_15_ACTIVE='no'
CRON_15_TIMES='40 8 * * 7'
CRON_15_COMMAND='/root/play.sh mclien'
Das sind die Beispiele für die Sonntags Weckzeiten. Analog gibts dann Mo-Sa. Sobald man diese Datei in dem config Menü speichert, wird die Datei geschrieben und bei Verlassen des Menüs eine neue crontab gebaut, bei der alle Einträge mit CRON_*_ACTIVE='no' weggelassen werden.

Meine Intention ist nun auf dem Display immer die nächste anstehende Weckzeit für "mclien" und "Frau" anzuzeigen inkl. der Info, ob die Weckzeit "an" oder "aus" ist.

mit dem "date" Befehl kann ich ja mittels -d Option folgende Werte erzeugen: "jetzt", "jetzt+24h"(tomorrow), ich kann auch aus den einem Wochentag und der Uhrzeit den Weckzeitpunkt in das passende date Format überführen:

Code: Alles auswählen

# nächster Mittwoch 13:37
date --date "wed 13:37" '+%a %H:%M %Y %m %d'
Wed 13:37 2015 02 11 (am Do, 5.2.2015, 16:04)
allerdings funktioniert das nur mit den namen der Wochentage, nicht mit Zahlen. Also ein Array gebaut:

Code: Alles auswählen

NUMDOW=(sun mon tue wed thu fri sat sun)
echo ${NUMDOW[2]}
tue
Damit könnte ich dann mittels test Kommando ermitteln welche Zeiten zwischen jetzt und in 24h liegen, was dann die nächste kommende Weckzeit wäre und auch nach Mitternacht noch funktioniert.

Allerdings weiß ich jetzt nicht, ob es schlau ist die o.g. Datei mittels source als Variablen einzulesen oder lieber als Textdatei mit grep/awk/sed zu "behandeln". Ich habe es mit Variablen versucht, bin aber zu unwissend die in einer for Schleife weiter zu bearbeiten (zumindest wird mir immer eine falsche Substitutioin angemeckert):

Code: Alles auswählen

for i in `seq 2 15`
do
CRON_${i}_TIMES_T=`echo "$(CRON_${i}_TIMES)" | awk '{print $2":"$1}'`
done
Irgendwie scheint mir meine Vorgehensweise aber auch generel zu kompliziert zu sein...
Also die Essens ist eigentlich aus de obigen Datei eine textdatei zu machen die etwas das enthhält:

Code: Alles auswählen

Frau
on 7:45
mclien
off  5:42
Irgendwie ist es jetzt aber voll verknotet in meinem Hirn.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: bash crontab: wer ist der nächste?

Beitrag von newdeb » 05.02.2015 20:45:19

Code: Alles auswählen

awk -F"[ ']" '
  /CRON_.*_NAME/  {printf "%s\n",substr($2,index($2,"_")+1)}
  /CRON_.*_ACTIVE/{printf "%s ",($2=="yes")?"on":"off"}
  /CRON_.*_TIMES/ {printf "%d:%d\n",$3,$2}
' cron_daten

Antworten