Zeitmessung Webseite per Cronjob

lyn2k9

Member
Hallo liebes Forum,

ich möchte gerne ein Shell Script schreiben, was mir die Zeitdauer für das Laden einer Homepage protokolliert und per Cronjob in eine Log schreibt mit Zeitstempel.

Für die Messung der Zeit habe ich mir folgendes überlegt:

Code:
/usr/bin/time -f "%E real" wget "URL" -o /dev/null

Ergebnis: 0:05.42 real

Das könnte man ja recht einfach für ">>" fortlaufend in eine Log schreiben. Leider fehlt mir hier ein Timestamp.

Also habe ich probiert mit date das Ergebnis zu kombinieren und hier komme ich im moment nicht weiter.

Folgendes Script steht bis jetzt:

Code:
#!/bin/sh
SEARCHSTRING="URL"
DATE=`date`
TIME=`(/usr/bin/time -f "%E real"  wget $SEARCHSTRING -o /dev/null)`

FULLTIME="$TIME + $DATE"

echo $FULLTIME >> /opt/output.log

Wenn ich das Script ausführe bekomme ich auf der Konsole folgendes angezeigt: "0:03.79 real" und es wird die Datei output.log erstellt mit folgendem Inhalt "+ Wed Nov 13 14:32:39 CET 2013"

Liegt mein Fehler eventuell an der unterschiedlichen Syntax von "time" und "/usr/bin/time" ?

System ist ein aktuelles Ubuntu LTS

Über eine kleine Denkhilfe wäre ich dankbar :-)

Grüße

Lyn

EDIT: Ich hab vergessen zu schreiben, dass der -o /dev/null Parameter ebenfalls ignoiert wird.
 
Last edited by a moderator:
Anhand deines Beispiels einmal eine funktionierende Version:

Code:
#!/bin/bash
WGET_URL="http://serversupportforum.de/"

WGET_DATE=$(date --rfc-3339=seconds)
WGET_TIME=$(/usr/bin/time -f "%e" /usr/bin/wget -q -O /dev/null "${WGET_URL}" 2>&1)
echo "[${WGET_DATE}] ${WGET_TIME}" >> ./output.log

Zur Klärung: Du brauchst -q bei wget und musst STDERR von time an STDOUT umleiten, was mit 2>&1 passiert. Ansonsten landet die Ausgabe nicht in der Variable, sondern auf deinem Bildschirm. Das Datumsformat und den geloggten Text kannst du ja noch beliebig anpassen. Genauso das Zeitformat von time, siehe Manpage – da sind alle aufgeführt. Viel Spaß ;)


MfG Christian
 
Last edited by a moderator:
DANKESCHÖN

Vielen Dank killerbees19, du hilfst mir damit super weiter!

Finds auch gut, dass du es erklärt hast. Jetzt werde ich noch etwas am Feinschliff tunen :)

Ich wünsche einen schönen Abend
 
Ich klinke mich einfach mal mit ein. :)

Ich nutze CentOS und bei mir sagtdas Script nach dem ausführen im Log:
Code:
[2013-11-13 20:18:43+01:00] ./siteload.sh: line 5: /usr/bin/time: No such file or directory

Was mach ich falsch?

Danke
 
So,
hab nun bisschen was gebastelt.

Code:
#!/bin/bash
WGET_URL="http://domain.tld"

WGET_DATE=$(date --rfc-3339=seconds)
WGET_TIME=$(date && wget --quiet -O /dev/null "${WGET_URL}" 2>&1)
echo "[${WGET_DATE}] ${WGET_TIME}" >> ./output.log

Ausgabe im Log:
[2013-11-13 21:44:53+01:00] Wed Nov 13 21:44:53 CET 2013

Das kann doch so nicht stimmen, oder? :D
 
@killerbees19:

ich muss nochmal kurz nachfragen. Wenn ich jetzt weitere Suchanfragen abschicke müsste ich doch das Script wie folgt erweitern:

Code:
#!/bin/bash
WGET_URL1="http://test.url/download1.zip/"
WGET_URL2="http://test.url/download2.zip/"

WGET_DATE=$(date --rfc-3339=seconds)
WGET_TIME=$(/usr/bin/time -f "%e" /usr/bin/wget -q -O /dev/null "${WGET_URL1}" 2>&1 && /usr/bin/wget -q -O /dev/null "${WGET_URL2}" 2>&1)
echo "[${WGET_DATE}] ${WGET_TIME}" >> ./output.log

Leider habe ich das Gefühl er misst immer nur das erste WGET. Muss man die beiden WGETs noch in zusätzliche Klammern setzen?
 
time wertet nur die Zeit des übergebenen Befehls aus. Durch && ist es ein neuer für die Shell, davon bekommt es nichts mehr mit. Ich würde dir einmal empfehlen, dich mit den Grundlagen der Shell/-programmierung (vorzugsweise Bash) vertraut zu machen. Dazu gibt es viele gute Seiten und auch die Manpage ist ein guter Einstieg.

Für dein Problem: Entweder du übergibst es in etwa so:
Code:
WGET_TIME=$(/usr/bin/time -f '%e' bash -c "wget …; wget …; wget …; …" 2>&1)

Oder du arbeitest die Adressen der Reihe nach mit einer for-Schleife ab und rechnest die Zeiten dann z.B. mit bc zusammen. Was vermutlich sinnvoller wäre, da du so nur eine Variable mit allen HTTP-Adressen füllen musst und alles übersichtlich bleibt. Auch bei zukünftigeren Erweiterungen. Denn der gezeigte Beispielcode in diesem Beitrag ist suboptimal.


MfG Christian
 
Last edited by a moderator:
Ich möchte sachte auf das Kommando logger hinweisen. Das ist genau dafür da, Dinge mit Zeitstempel fallen zu lassen und kann sogar Syslog.

Code:
MEIN_COMMANDO -FOO | logger

Landet dann in /var/log/syslog bzw. /var/log/messages

Code:
man logger
 
Back
Top