ubuntuusers.de

reminder.sh - kleine Erinnerungen mit oder ohne at

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

fpunktk

Avatar von fpunktk

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 142

Hallo,

ich möchte auch mal eines meiner Projekte vorstellen. Es ist ein kleines Script für Erinnerungen.

Erstmal zum Grund und den Zielsetzungen: Normaler Weise benutze ich reminderfox für meine Erinnerungen. Bei kurzen und einmaligen Sachen ist das aber nicht optimal, weil es eher umständlich zu starten ist und nach dem Schließen des Browsers nicht mehr funktioniert. Eine Tilda läuft aber immer, also lag es nahe ein Shellscript für diese Aufgabe zu schrieben. Man soll mit einem einfachen Befehl die Erinnerung in Auftrag geben können und das ganze soll möglichst auch noch funktionieren, wenn der Rechner zwischenzeitlich neu gestartet wurde. Erinnert werden möchte ich akustisch und mit einer optischen Meldung.

Das folgende Script erledigt das jetzt:

  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
#!/bin/dash

# reminder.sh, ein kleines Script, welches nach vorgegebener Zeit ein akustisches Signal und eine Meldung ausgibt

# Copyright (C) 2011 Felix Kästner, reminder.sh @ f p u n k t k . de

# This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this program; if not, see http://www.gnu.org/licenses/.


if [ ! -x /usr/bin/kdialog -o ! -x /usr/bin/aplay -o ! -x /usr/bin/xmessage -o ! -x /usr/bin/file ]
then
    echo "kdialog, xmessage, file und aplay müssen installiert sein"
    exit 1
fi
[ ! -x /usr/bin/iconv ] && echo "es ist günstig, wenn iconv installiert ist"

defaultwavefile="/pfad/zu/default.wav"
if [ ! -f "$defaultwavefile" ]
then
    echo "keine gültige standard-wave-datei hinterlegt"
    exit 1
fi


reminderausgabe() {
    /usr/bin/kdialog --nograb --title reminder --msgbox "$1" & # nograb scheint nicht zu funktionieren
    if [ -x /usr/bin/iconv ]
    then
        /usr/bin/xmessage "$(echo "$1" | /usr/bin/iconv -f utf-8 -t iso-8859-1)" &
    else
        /usr/bin/xmessage "$(echo "$1")" &
    fi
    /usr/bin/aplay -q "$2" &
}


if [ "$1" = "--at" ]
then
    # Aufruf durch at, alle Befehle im Hintergrund ausführen
    { /bin/sleep $2; reminderausgabe "$3" "$4"; } &
    exit
elif [ $# -ge 1 ]
then
    reminput="$1"
    shift
    # eingaben der form [0-9]{1,3}[smh]+ passend für date umwandeln
    case $reminput in
        [0-9]|[0-9][0-9]|[0-9][0-9][0-9])
            reminput="${reminput}sec"
            ;;
        [0-9]s|[0-9][0-9]s|[0-9][0-9][0-9]s)
            reminput="${reminput}ec"
            ;;
        [0-9]m|[0-9][0-9]m|[0-9][0-9][0-9]m)
            reminput="${reminput}in"
            ;;
        [0-9]h|[0-9][0-9]h|[0-9][0-9][0-9]h)
            reminput="${reminput}ours"
            ;;
    esac
    
    tnow=$(/bin/date +%s) # Zeit jetzt in Sekunden seit 1970
    trem=$(/bin/date -d "$reminput" +%s) # Zeit für Erinnerung in Sekunden seit 1970
    tremreadable=$(/bin/date -d "$reminput" '+am %A, dem %d.%m.%Y um %H:%M:%S') # lesbare Zeit für Erinnerung zur Ausagebe bei der Überprüfung
    tremreadablemsg=$(/bin/date -d "$reminput" '+%Y-%m-%d-%H:%M:%S') # lesbare Zeit für die Erinnerungsmeldung
    tremat=$(/bin/date -d "$reminput" +%Y%m%d%H%M) # Zeit für at
    trematsec=$(/bin/date -d "$reminput" +%S) # Sekunden für verzögerten Aufruf mit at
    remindersleeptime=$(($trem - $tnow))
    
    if [ $remindersleeptime -le 0 ] # bei negativer remindersleeptime abbrechen
    then
        echo "abbruch da remindersleeptime = $remindersleeptime"
        exit 1
    fi
    
    # überprüfen, ob eine gültige wave-Datei übergeben wurde
    if [ -f "$1" -a "$(/usr/bin/file -ib "$1")" = "audio/x-wav" ]
    then
        wavefile="$1"
        shift
    else
        wavefile="$defaultwavefile"
    fi
    
    remindermsg="${*:-reminder}" # Erinnerungsnachricht, default ist "reminder"
    echo -n "in $(($remindersleeptime / 60)) minuten $tremreadable wird \"$remindermsg\" ausgegeben. " # zur Überprüfung wird ausgegeben, was gemacht wird
    remindermsg="reminder $tremreadablemsg:\n\n$remindermsg" # noch die Zeit mit in die Erinnerungsnachricht aufnehmen
    
    if [ $remindersleeptime -ge 1000 ] # wenn es bis zur Erinnerung noch lange dauert, dann wird nachgefragt, ob alles richtig ist.
    then
        echo "Wenn das falsch ist, dann mit Strg + c abbrechen, sonst mit Enter fortfahren."
        read input
    else
        echo
    fi
    
    if [ $remindersleeptime -le 300 ] # wenn es bis zur Erinnerung nicht lange dauert, dann wird sleep benutzt, ansonsten at, für die ersten zwei Minuten ist sleep vermutlich die bessere Wahl
    then
        # alle Befehle im Hintergrund ausführen
        { /bin/sleep $remindersleeptime; reminderausgabe "$remindermsg" "$wavefile"; } &
    else
        # at wird benutzt
        echo "DISPLAY=$DISPLAY $0 --at $trematsec \"$remindermsg\" \"$wavefile\"" | /usr/bin/at -t "$tremat" 2> /dev/null
    fi
else
    echo "Benutzung: $0 Zeitdauer|Zeitpunkt [auszugebende wave-Datei] [auszugebende Nachricht]"
fi

Was man anpassen kann:

  • man muss nicht kdialog und xmessage benutzen, eins von beidem oder etwas ganz anderes sollte auch gut sein (bei mir hat einmal die Ausgabe mit kdialog nicht funktioniert, also benutze ich jetzt erstmal beides, der Befehl für xmessage ist so gemacht, dass neue Zeilen mit \n und Umlaute in UTF-8 verstanden werden)

  • aplay kann man auch durch beep ersetzen, eventuell hat auch das message-Programm etwas für die Tonausgabe eingebaut

  • die Abfragen mit remindersleeptime können angepasst werden

Was man verbessern kann:

  • einige Optionen stehen hart im Script, die könnten noch als Variablen an den Anfang, da sie aber nur einmal auftauchen finde ich das nicht so schlimm

Hinweise:

  • at versteht nur Zeitangaben mit vollen Minuten, daher werden die Sekunden extra übergeben und es wird dann mit sleep so lange gewartet

  • at sorgt im übrigen auch dafür, dass sich der Rechner nach einem Neustart an die Aufgaben erinnert

  • da ich sparsam bin nutze ich Dash statt Bash 😉 nur #/bin/sh sollte auch funktionieren

Welche Zeitangaben werden verstanden?

  • so gut wie alle 😉 also alles, was sleep und die case-Anweisung verstehen

  • Angaben zur Zeitdauer wie 10 oder 10s oder 10sec für 10 Sekunden, 7m oder 7min für 7 Minuten, h oder hours für Stunden (die Versionen mit einem oder keinem Buchstaben werden durch die case-Anweisung ermöglicht), die Langversionen kann man verbinden: 1hours10min oder "1hours 10min" (in Anführungszeichen, damit es in einer Variablen steht)

  • Angaben zum Zeitpunkt: 13:37 oder 12:34:56 oder "YYYY-MM-DD HH:MM" oder "tomorrow 11:00"

Teile des Scriptes habe ich schon im Forum und im zugehörigen Wikiartikel unter gebracht.

Über Meinungen und Verbesserungsvorschläge freue ich mich. Über Lob natürlich auch 😉

nbkr

Avatar von nbkr

Anmeldungsdatum:
29. Oktober 2007

Beiträge: 1936

Wohnort: Aschaffenburg

Warum das Rad neu erfinden? remind gibt es doch schon ☺

fpunktk

(Themenstarter)
Avatar von fpunktk

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 142

nbkr schrieb:

Warum das Rad neu erfinden? remind gibt es doch schon ☺

Richtig, ich erinnere mich dunkel davon gelesen zu haben. Aber die Manpage zu remind hat mich einfach erschlagen, also wollte ich was einfacheres und eigenes.

Bei Gelegenheit kann man sich aber auch remind mal genauer ansehen. Und dann sollte man einen Wikiartikel dazu schreiben.

MOTSM

Avatar von MOTSM

Anmeldungsdatum:
24. April 2009

Beiträge: 88

also ich mache das mit Gnome Do und zwar speziell mit dem Plugin http://do.davebsd.com/wiki/RemindMe_Plugin

fpunktk

(Themenstarter)
Avatar von fpunktk

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 142

Ich habe mir remind jetzt mal angesehen und sehe noch nicht, wie das meine Zielsetzungen umsetzen kann. remind ist eher ein großer Kalender für wiederkehrende Aufgaben (wofür ich reminderfox nutze). Ich wollte aber etwas speziell für schnelle, einmalige, teilweise sekundengenaue Erinnerungen. Ich denke dafür eignet sich remind nicht.

MOTSM schrieb:

also ich mache das mit Gnome Do und zwar speziell mit dem Plugin http://do.davebsd.com/wiki/RemindMe_Plugin

Das sieht wie eine andere Umsetzung meiner Idee aus. Finde ich auch gut.

Nebenbei habe ich noch Probleme an meiner Umsetzung gefunden (da ich meinen Rechner erst jetzt mal wieder neu gestartet habe):

  • wenn man zwischenzeitlich den Rechner neu startet, dann erscheint bei mir kein kdialog-Fenster, nur mit xmessage klappt das

  • wenn man nicht eingeloggt ist, dann gehen die Fenster auch verloren, man hört bestenfalls den Hinweiston

Grund dafür ist vermutlich, dass at eigentlich nur für Konsolenanwendungen gedacht ist.

Antworten |