Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Generic1
- Beiträge: 78
- Registriert: 15.11.2012 13:41:28
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:
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
-
shoening
- Beiträge: 914
- Registriert: 28.01.2005 21:05:59
- Lizenz eigener Beiträge: MIT Lizenz
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
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
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?
-
goeb
- Beiträge: 348
- Registriert: 26.08.2006 18:12:08
- Lizenz eigener Beiträge: MIT Lizenz
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.
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
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