#!/bin/bash +x # formato record calendario # YYYY-MM-DD HH:MM DESCRIZIONE # Manteniamo la prima parte per aggiornare il calendario, senza bisogno di un file # delle scadenze, mantenendo una copia di backup solo al fine di capire cosa era # gia presente e cosa e stato aggiunto. test -f "$1" || { #controllo parametri echo il primo parametro deve essere un file calendario esistente exit 1 } # Non ci serve file scadenze #test "$2" || { # echo servono due parametri, il secondo deve essere un nome di file delle scadenze da creare o aggiornare # exit 2 #} CALENDARIO="$1" #FILEALLARMI="$2" test -f "OLD-$CALENDARIO" || touch "OLD-$CALENDARIO" #verifica/crea file backup calendario cat "$CALENDARIO" | while read DATA ORA DESCRIZIONE do SCADENZA=$(date +%s -d "$DATA $ORA") # conversione in secondi dal 1970-01-01 01:00 #RIGAGIORNOPRIMA="$(( SCADENZA - 24*60*60 )) $DATA $ORA $DESCRIZIONE" #RIGAORAPRIMA="$(( SCADENZA - 60*60 )) $DATA $ORA $DESCRIZIONE" # Dopo aver calcolato "meno un giorno" e "meno un'ora" bisogna riconvertire i timestamp # in formato "YYMMDDhhmm", quello piu pratico in # questo caso, tra i vari accettati da at. # @ operatore di date per cambiare da epoch a timestamp GIORNOPRIMA="$(date '+%Y%m%d%H%M' -d @$(( SCADENZA - 24*60*60 )) )" ORAPRIMA="$(date '+%Y%m%d%H%M' -d @$(( SCADENZA - 60*60 )) )" # L'intera logica e attuabile da un singolo script, ma i job schedulati con at allo stesso minuto rischiano # di scrivere concorrentemente sullo stesso file, per cui è necessario utilizzare un lock. Il primo processo # a lanciare flock $HOME/promemoria acquisisce un lock esclusivo, se altri fanno lo stesso restano in attesa # finche il lock non viene rilasciato. grep -qx "$DATA $ORA $DESCRIZIONE" "OLD-$CALENDARIO" || { # -q quiet, -x matcha solo linee intere. Se non trova match entra nella sequenza at -t "$GIORNOPRIMA" <<< "flock $HOME/promemoria echo '$DESCRIZIONE scade il $DATA alle $ORA' >> $HOME/promemoria" # at si aspetta come parametro il tempo a cui fare il comando e poi prende da stdin il comando da eseguire, in questo caso at -t "$ORAPRIMA" <<< "flock $HOME/promemoria echo '$DESCRIZIONE scade il $DATA alle $ORA' >> $HOME/promemoria" } done cat "$CALENDARIO" > "OLD-$CALENDARIO"