Shell Script timing

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Generic1
Beiträge: 78
Registriert: 15.11.2012 13:41:28

Shell Script timing

Beitrag von Generic1 » 06.03.2013 14:50:54

Hallo,

ich hätte noch wahrscheinlich eine eher unsinnige Frage :-) aber ich bin mir da absolut nicht sicher
Und zwar wenn ich folgende Endlosschleife habe:

Code: Alles auswählen

while true 
do
  sleep 5
  machwas 
done
machwas ist eine methode ( machwas () ) in der was gemacht wird, dass vielleicht länger als 5 sec dauert.
Meine Frage wäre jetzt was passiert da beim Shellsscript, wird machwas ausgeführt und dann wieder 5 sec gewartet oder wird immer 5sec gewartet egal was machwas macht?

Besten Dank,
lg
Generic1

Benutzeravatar
shoening
Beiträge: 914
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell Script timing

Beitrag von shoening » 06.03.2013 15:10:13

Hi,

solche Fragen loest man ueblicherweise schnell und einfach selbst durch

A) Lesen: man sleep

oder

B) Probieren: was passiert wenn machwas() einfach ein weiterer sleep ist?

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Shell Script timing

Beitrag von Cae » 06.03.2013 15:14:17

Visualisierung:

Code: Alles auswählen

_____###_____###_____###_____###...
_____###++_____###++_____###++_____###++...
_ ist sleep, immer fuenf Sekunden. # ist deine Funktion, die braucht in der ersten Zeile drei Sekunden, in der zweiten dagegen zwei weitere.

Du siehst, was passiert? Es wird grundsaetzlich fuenf Sekunden gewartet, egal, was irgendwann dazwischen passiert. Es kann nicht passieren, dass machwas() erneut gestartet wird, waehrend das vorhergige machwas() noch laeuft.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Shell Script timing

Beitrag von uname » 06.03.2013 16:49:20

Es kann nicht passieren, dass machwas() erneut gestartet wird, waehrend das vorhergige machwas() noch laeuft.
Wenn er machwas() von der Shell abforkt (mit & am Ende) dann schon.

Auch wenn es nicht gefragt wurde: Interessant wäre ja zu versuchen zu programmieren, dass die Schleife immer genau 5 Sekunden dauert. Somit also ein "sleep" abzüglich von machwas(). Man könnte doch bestimmt z.B. mit "time" die Ausführzeit von machwas() stoppen und dann beim nächsten Sleep einfach abziehen, oder?

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell Script timing

Beitrag von goeb » 06.03.2013 17:40:41

Unter der Voraussetzung das machwas nie länger als 5 Sekunden läuft:

Code: Alles auswählen

do_something() {
  local s=$(( $RANDOM % 5 ))
  echo -n "sleeping $s secs "
  sleep $s
}

export TIMEFORMAT="%R"
while true ; do
  echo -n "> "
  { foo=$( { time do_something 1>&3- 2>&4- ; } 2>&1 ) ; } 3>&1 4>&2
  echo -n " awake. "
  sleep $( bc <<<"5 - $foo" )
  date +"%S"
done
Siehe http://mywiki.wooledge.org/BashFAQ/032 für das time-Zeugs. Ist Bash-spezifisch (Edit: und braucht bc), aber da kommt sicher gleich Meillo vorbei und liefert 'ne portable Version. :wink:

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Shell Script timing

Beitrag von Cae » 06.03.2013 18:24:09

Code: Alles auswählen

#!/bin/sh

time() {
	savedate="$(date +%s.%N)"
	$@
	echo "scale=9; $(date +%s.%N) - $savedate" | bc >&2
}

do_something() {
	RANDOM="$(od -An -N8 -tu8 /dev/urandom)"
	s=$(($RANDOM % 5))
	echo -n "sleeping $s secs "
	sleep $s
}

while :; do
	echo -n "> "
	foo="$(time do_something 2>&1;)"
	msg="$(echo "$foo" | cut -d\  -f-3)"
	time_taken="$(echo "$foo" | cut -d\  -f4)"
	echo -n "$msg awake. "
	sleep $(echo "5 - $time_taken" | bc)
	date +"%S"
done
Allerdings ist da der nette "'awake.' kommt zur korrekten Zeit"-Effekt weg, weil ich dieses Subshell-Monster nicht zum Laufen bekommen hab'. Anscheinend kann die Dash keine weiteren Output-FDs aufmachen (glaub' ich aber nicht). time ist kein Builtin, daher hab' ich's nachgebaut [1], ebenso $RANDOM.

Gruss Cae

[1] Achtung, wahrscheinlich geht so etwas wie time "foo 'bar baz' boom" kaputt und kommt als als [foo][bar baz][boom] an, anstatt als Programm [foo 'bar baz' boom]. Oder sowas in der Richtung, das ist mir jetzt egal.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten