Diskussion:Acpiwakeupscript
Aus VDR Wiki
ich habe ein ähnliches Skript. Es macht einen täglichen festen Wakeup, außer es liegt ein Timer davor. Ich rechne intern mit den Datum in Sekunden seit 1970, das kann amn dann auch schön in das passende Format konvertieren.
Ich bin leider ein Laie aber vielleicht hilft es ja trotzdem. Interessant dürfte das lesen der Timer sein und das erstellen des "Default-Timers". Hier mal das ganze Skript:
#!/bin/bash # # ShutDown.sh # - Prüft, ob gerade eine Aufnahme läuft # - Kein shutdown am Tag (Serverbetrieb) # - Täglicher start (Serverbetrieb) # set -x # Gen2VDR V2 source /etc/vdr.d/conf/vdr source /etc/vdr.d/conf/gen2vdr.cfg LOG=/log/shutdown.log SVDRPCMD=/usr/bin/svdrpsend.pl WAKEUP_FILE="/_config/status/Wakeup" WAKEUP_FLAG="/_config/status/~Wakeup_Flag" CMD_LST="mplayer noad" Wakeup=08:35 # Normale Einschaltzeit (HH:MM) SOn=7 # Serverbetrieb Startzeit (H) im 24h-Format SOff=0 # Serverbetrieb Endzeit (H) im 24h-Format SEND=/usr/sbin/send # Pfad zum 'Send' (Message Plugin) DATE=/bin/date # Pfad zum 'Date' POWERDOWNFLAG=/etc/killpower # Stromausfall! SHUTDOWN_FILE=/_config/status/~waitforshutdown # at nur einmal starten logger -s "$0 $*" #Parameter in Variable speichern PAR0=$0 PAR_=$* PAR1=$1 PAR4=$4 sAktDat="`date -d \"now\" +\"%s\"`" # aktuelles Datum in sekunden WakeupDat="`date -d \"now\" +\"%Y-%m-%d $Wakeup\"`" # Wakeup-Datum (8:30h) sWakeupDat="`date -d \"$WakeupDat\" +\"%s\"`" # Wakeup-Datum in sekunden # WAKEUP_FLAG löschen [ -f $WAKEUP_FLAG ] && rm -f $WAKEUP_FLAG function check_ontime () { #Kein ShutDown in der vorgegebenen "Server-Zeit" if `date +%k` -gt $SOn && `date +%k` -ne $SOff ; then ERR_MSG="Kein Shutdown zwischen $SOn und $SOff Uhr" logger -s "[$0] $ERR_MSG" $SVDRPCMD MESG $ERR_MSG # VDR 'drückt' alle paar Minuten den Power-Knopf. Taste drücken um ihn davon abzuhalten sleep 6 $SVDRPCMD HITK Back exit 2 fi return } function set_next_shutdown () { if [ -f $SHUTDOWN_FILE ]; then logger -s "[$0] Shutdown already set!" #return 1 fi echo "$PAR0 $PAR_ > $LOG 2>&1" | at now +$1 minutes touch $SHUTDOWN_FILE } # [Shutdown per CRON] Prüft, ob gerade eine Aufnahme läuft if [ "$1" = "cron" ] ; then # Aufruf über cron #Kein ShutDown in der vorgegebenen "Server-Zeit" check_ontime #Läuft ein Timer? RESULT=$($SVDRPCMD -p ${VDR_PORT:-2001} NEXT REL | awk '/^250/ { print $3 }') if [[ $RESULT < 1 ]]; then logger -s "[$0] Aufnahme läuft! Shutdown um 20 Minuten verschoben" set_next_shutdown 20 exit 1 else logger -s "[$0] keine Aufnahme; Shutdown" fi fi if [ "$1" != "force" ] ; then for x in ${CMD_LST} ; do if pidof $x >/dev/null ; then $SVDRPCMD MESG "$x läuft! Shutdown in 15 Minuten!" logger -s "[$0] $x läuft! Shutdown in 15 Minuten!" set_next_shutdown 15 exit 1 fi done fi # Eingefügt um Shutdown am Tag zu verhindern (kann mit 'force' umgangen werden) if [ "$1" = "force" ] || [ "$1" = "cron" ] ; then # Aufruf über Skript logger -s "Shutdown ($1)!" PAR1=0 # Abfrage ob runtergefahren werden soll (Message-Plugin nötig) $SEND ask -s -t 5 "Ausschalten abbrechen?" RC=$? case $RC in 0) echo -n "Failed (Timeout)";; 1) echo -n "Success";; 2) echo -n "Confirmed (OK)" $SVDRPCMD MESG "Shutdown abgebrochen!" exit 1 ;; 3) echo -n "Aborted (Exit)" $SVDRPCMD MESG "Shutdown abgebrochen!" exit 1 ;; *) echo -n "unbekannt ($RC)";; esac # Timer einlesen und Auswerten while IFS=: read id station date start stop pri life desc epgsearch do starttime=${start:0:2}:${start:2:2} # ${string:position:length} wtimer="`$DATE -d \"$date $starttime\" +\"%s\"`" # Ist der letzte Timer der nächste? if [ -z $ntimer ] || [ $ntimer -gt $wtimer ] ; then if [ "$id" = "1" ] && [ $wtimer -gt $sAktDat ] ; then # Nur aktive Timer die nicht schon laufen ntimer=$wtimer PAR1=$ntimer PAR4=$desc #echo "---- Nächster NTimer! ----" logger -s "[$0] Nächster Timer: PAR1: $PAR1 PAR4: $PAR4" fi fi done </etc/vdr/timers.conf # Da werden die Timer gespeichert else #Kein ShutDown in der vorgegebenen "Server-Zeit" check_ontime fi # Heutiger Startzeitpunkt schon vorbei? if [ $sAktDat -gt $sWakeupDat ] ; then let sWakeupDat="$sWakeupDat +86400" # +24h WakeupDat="`$DATE -d \"1970-01-01 UTC $sWakeupDat seconds\" +\"%Y-%m-%d %R\"`" fi # Testen ob der nächste Timer vor dem nächsten Wakeup liegt und falls nötig den Wakeup anassen. if [ $PAR1 -gt $sWakeupDat ] || [ "$PAR1" = "0" ] ; then # Normaler Wakeup PAR1=$sWakeupDat PAR4="" else # PAR1 wird neuer Starttermin. Vorher in das rechte Format wandeln NEXT_ALARM="`$DATE -d \"1970-01-01 UTC $PAR1 seconds\" +\"%Y-%m-%d %R\"`" fi #Zeit bis zum nächsten Timer let PAR2="$PAR1 - $sAktDat" [ -f $SHUTDOWN_FILE ] && rm -f $SHUTDOWN_FILE # Original Shutdown-Skript aufrufen ## Beispiel: /_config/bin/vdrshutdown 1165026000 9816 34 nano~Die Welt von morgen 1 #logger -s "$1 = $PAR1" if [ "$PAR4" = "" ] ; then # Nicht vom VDR gestartet PAR4="Automatischer-Wakeup" /_config/bin/vdrshutdown.sh $PAR1 $PAR2 00 "$PAR4" 1 > /var/log/vdrshutdown.log 2>&1 RC=$? # SHUTDOWN_FILE löschen damit VDR bein nächsten Start an bleibt [ -f $WAKEUP_FILE ] && rm -f $WAKEUP_FILE else /_config/bin/vdrshutdown.sh $PAR1 $PAR2 $3 "$PAR4" $5 > /var/log/vdrshutdown.log 2>&1 RC=$? fi # Rückgabecode if [ "$RC" = "1" ] ; then set_next_shutdown 10 exit 1 else logger -s "RetunCode: $RC" exit 0 fi