PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie Zeitdifferenz mit Bash-Skript korrekt bestimmen?



Linus
29-03-2009, 19:54
Bei der Umstelleung letzte Nacht ist mir aufgefallen, das eines meiner Skripte
nicht richtig funktioniert, weil es für Zeitdifferenzen den Wert von

date %s

verwendet und dabei offenbar NICHT wie in der manpage beschrieben die Sekunden
seit 1.1.1970 verwendet werden sondern Datum/Uhrzeit linear, ohne
Zeitumstellung und ohne Schaltsekunden!

Wie kann man denn die Zeitdifferenz mit einem Bash-Skript richtig ermitteln? :confused:

jan61
30-03-2009, 19:49
Moin,

aus man date:

%s seconds since `00:00:00 1970-01-01 UTC' (a GNU extension)

Das Format sollte also schon die Sekunden OHNE Berücksichtigung einer Zeitzone anzeigen, allerdings nur, wenn Du "+%s" schreibst ;-)


jan@jack:~> date
Mo Mär 30 19:46:14 CEST 2009
jan@jack:~> date +%s;date -u +%s
1238435251
1238435251


Jan

Linus
30-03-2009, 21:04
Ok, das korrekte Format ist

date +%s

und das steht auch so im Skript :rolleyes:
Zudem sehe ich keinen Unterschied ob mit oder ohne -u und beim Nachzählen sehe ich, das date die Zeitumstellung doch korrekt mitgemacht hat :rolleyes:

Allerdings sehe ich das das Skript gelegentlich hängen bleibt, an genau der Stelle mit date, weil das Skript mit "set -x" beginnt und hinter dem date ein echo kommt, also eine simple Ausgabe.
Wieso bleibt das Skript beim date +%s mit 99 % CPU load hängen? :confused:

jan61
01-04-2009, 19:26
Moin,

das war der Sinn meines Beispiels - zu zeigen, dass date +%s zeitzonenunabhängig arbeitet ;-)

Zu Deinem anderen Problem: Ich behaupte einfach mal, dass das nicht an einer einfachen Ausgabe liegt und auch nicht am "set -x". Um das beweisen zu können, bräuchte ich aber mal den entsprechenden Code-Abschnitt.

Jan

Linus
02-04-2009, 01:28
Also die simple Ausgabe mit echo steht im Skript, aber die Ausgabe mittels set -x bleibt beim date stehen.
Es wird also das date ausgeführt, aber nicht das echo eine Zeile tiefer.
Das ist das Misteriöse.

Hier der Code-Ausschnitt:



time1=`expr \`date +%s\``
fi
echo "FooBar"


Beim heutigen Hängenbleiben ist das Ende der Ausgabe (mittels set -x):

+++ date +%s
+ time1=

Und das

trap "rm -f $lockfile; sleep 5; exit" SIGHUP SIGINT SIGTERM

funktionierte noch.

jan61
02-04-2009, 19:18
Moin,


...


time1=`expr \`date +%s\``
fi
echo "FooBar"
Beim heutigen Hängenbleiben ist das Ende der Ausgabe (mittels set -x):

+++ date +%s
+ time1=


Da fehlen Operator und ein Operand im expr - was willst Du denn berechnen? Das Script bleibt nicht in der Ausgabe hängen, sondern in der Zuweisung an time1, und zwar weil der expr nicht beendet werden kann.

Jan

Linus
02-04-2009, 20:13
Moin,
Da fehlen Operator und ein Operand im expr - was willst Du denn berechnen? Das Script bleibt nicht in der Ausgabe hängen, sondern in der Zuweisung an time1, und zwar weil der expr nicht beendet werden kann.
Jan

Also mit dem expr soll der Wert von

date +%s

in die Variable time1 geschrieben werden.
Das funktioniert meistens, aber nicht immer, nachdem es monatelang problemlos lief.
Wie muß die Zeile mit dem date denn richtig aussehen?
Reicht ein

time1=$(date +%s)

? :confused:

jan61
03-04-2009, 19:38
Moin,

ja, das reicht. Oder in Deiner ursprünglichen Syntax time1=`date +%s`.

Ich habs gerade mal ausprobiert - expr läuft auch ohne 2. Operand (und gibt einfach nur den 1. Operanden aus). Überflüssig ist er auf jeden Fall. Warum das Script an der Stelle jetzt rumspinnt, muss also noch eine andere Ursache haben. Vielleicht weiter vorn im Script?

Jan

Sid Burn
04-04-2009, 04:07
Bei der Umstelleung letzte Nacht ist mir aufgefallen, das eines meiner Skripte
nicht richtig funktioniert, weil es für Zeitdifferenzen den Wert von

date %s

verwendet und dabei offenbar NICHT wie in der manpage beschrieben die Sekunden
seit 1.1.1970 verwendet werden sondern Datum/Uhrzeit linear, ohne
Zeitumstellung und ohne Schaltsekunden!

Naja die UTC Zeit oder anders gesagt die "Sekunden die seit 1.1.1970" vergangen sind enthalten natürlich keine Zeitumstellung und Schaltsekunden etc.

Mit Sekunden die Seit 1.1.1970 vergangen sind, sind wirklich die "reale" Sekunden gemeint die seit dem vergangen sind.

Und bei einer Zeitumstellung sind ja nicht auf einmal 3600 Sekunden von einer auf der anderen Sekunde mehr vergangen, sondern es ist nur eine Sekunde an Zeit vergangen, aber von 2 uhr einfach auf 3 uhr gestellt worden. Dadurch sind aber ja nicht mehr sekunden in der zeit vergangen.

Ansonsten wenn du mit der "nicht echten Zeit" (naja etwas blöder begriff, weiß aber nicht wie man es besser beschreibt) rechnen möchtest ist die UTC Zeit falsch, das geht damit nicht.

Ansonsten müsstest du auch eine Zeitzone angeben, den die Zeitumstellung ist nicht immer gleich und nach festen Regeln definiert sondern sind komplett Politische entscheidungen!


Von daher hat das ganze schon alles richtig gemacht, nur war es wohl nicht das was du wolltest. ;)