Escaping-Problem

Der_Da_93

Der_Da_93

irgendwie
Hallo liebes Unixboard,
Ich bin gerade dabei einen Home-Server dazu zu bringen selbständig nachts hochzufahren (um ihn Backups machen zu lassen) und ihn wieder runterfahren zu lassen.
Das Hochfahren ist unter Debian mit rtcwake einfach zu lösen. Jetzt möchte ich aber, dass er nur dann runterfährt, wenn er auch via rtc gestartet wurde.

Dafür habe ich mir überlegt, dass mein rtcwake-Script in eine Datei die geplante Aufwachzeit schreibt.
Denn wenn jetzt das Backup fertig ist, sollte sich hiermit (Pseudo-Code) feststellen lassen, ob er via rtc gestartet wurde:
Code:
rtctime //aus der Datei
uptime
boottime = now-uptime; // Zeit zu der der Rechner gestartet wurde
delta = |boottime-rtctime|
if(delta < 3 min){
   //wurde also per rtc gestartet
}

Nun hab ich versucht das mit einem Bash-Script zu lösen:
PHP:
#!/bin/bash

function startedByRTC() {
	rtctime=`cat rtcwake`; //die Datei
	now=`date +%s`;
	up=`awk '{print $1}' /proc/uptime`;
	up= $(echo "scale=0;$up/1"|bc); //runden
	boottime=`expr $now - $up`;
	delta= `expr $rtctime - $boottime`;
	if[`test $delta -lt 180` &&  `test $delta -gt -180`]
		then
			return $TRUE;
		else
			return $FALSE;
	fi
}

Leider gibt's dabei ein Problem
In der Zeile, in der ich versuche zu runden, wird das Semikolon als Befehlstrenner interpretiert, es kommt die Fehlermeldung "$up (also die Zahl von $up): Kommando nicht gefunden"
Ich hab schon versucht mit "\" zu escapen, dafür bekomme ich dann "illegal character".

Kann mir jemand helfen?


P.S.: Ich bin ein absoluter bash-Anfänger und nehme auch andere Verbesserungsvorschläge gerne an.
 
Zuletzt bearbeitet:
Code:
...
up= $(echo "scale=0;$up/1"|bc); //runden
...
Bei mir funktioniert Deine Zeile, sobald ich das Leerzeichen zwischen up= und $( entferne:
Code:
up=$(echo "scale=0;$up/1"|bc); //runden

... und nehme auch andere Verbesserungsvorschläge gerne an.
Zur besseren Lesbarkeit würde ich bei Kommandosubstitutionen konsequent auf die Backticks `...` verzichten und nur $(...) benutzen. Ergibt das Selbe, liest sich aber besser. Deine Semikola an den Zeilenenden sind überflüssig.
 
Hallo Spröde,
Danke für deine Antwort. Leider hab ich festgestellt, dass der Fehler nicht zu dieser Zeile, sondern zu der eins darüber gehört.
PHP:
up= $(awk '{print $1}' /proc/uptime);
Wenn ich die Zeile direkt eingebe, lautet der Fehler:
Code:
If '1901.61' is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf 1901.61
 
Auch hier gehört das Leerzeichen zwischen "up=" und "$(..." raus.
 
Um Dir die Fehlerorgie zu ersparen, die Dir bevorsteht (z.B. werden Kommentare mit # eingeleitet), mal einen alternativen Code:
Code:
#!/bin/bash

function startedByRTC() {
    rtctime=$( <rtcwake ) # die Datei
    up=$( </proc/uptime )
    up=${up//.*/} # abrunden, weil es einfacher ist - oder stoert das?
    boottime=$(( $( date +%s ) - $up ))
    delta=$(( $rtctime - $boottime ))
    if [ $delta -lt 180 -a $delta -gt -180 ]
        then
            return $TRUE
        else
            return $FALSE
    fi
}
Zur Programmlogik, kann ich natürlich nichts sagen.
 

Ähnliche Themen

bash esac problem

Queue für copy Script

MacBook Pro hat Benutzer-Konten vergessen

CentOS 6.3 RADIUS - Keine Verbindung möglich

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben