Re: Frage zu cron/Shellscripting

From: Oliver Fromme <olli(at)secnetix.de>
Date: Wed, 23 Apr 2003 18:44:43 +0200 (CEST)

Marcus Franke <Marcus.Franke(at)viebranz.de> wrote:
> Der Befehl muss auch nicht genau alle 10
> Sekunden laufen.
>
> Mein Kollege will nur auf dem Webserver ein
> bestimmtes Bild per convert umrechnen :)

Wäre es da nicht viel sinnvoller, ein CGI zu schreiben, das
nur dann die Umrechnung vornimmt, wenn auch tatsächlich je-
mand das Bild abruft? Alle zehn Sekunden stur ins Blaue
hinein zu konvertieren finde ich -- um ganz ehrlich zu sein
-- ein wenig krank.

Üblicherweise werden solche Probleme so gelöst, daß das CGI
die Umrechnung/Erzeugung durchführt und das Ergebnis (Bild)
in einem Temporärverzeichnis cacht. Beim nächsten Aufruf
guckt das CGI, ob es das Bild schon im Cache hat _und_ ob
es jünger als X Sekunden ist (in Deinem Fall X == 10).
Wenn ja, wird einfach die statische Datei nochmals ausge-
liefert. Wenn nein: neu erzeugen und cachen.

Das hört sich jetzt kompliziert an, ist in der Praxis aber
recht einfach zu realisieren. Ich würde es auch dann tun,
wenn es nur ein kurzfristiger »Hack« sein soll.

> > #!/bin/sh -
> > next=$(date +%s)
> > while :; do
> > next=$(( $next + 10 ))
> > sleep $(( $next - $(date +%s) ))
> > befehl
> > done
> Krass, das muss ich erst mal verstehen, was
> hier genau passiert :)

»date +%s« liefert Dir einen Sekunden-Offset (seit 1.1.1970
0:00 UTC). Probier's aus.

$() ist eine andere Schreibweise für Backticks (``), die
ich in letzter Zeit vorziehe, weil man es besser schachteln
kann, es besser lesbar ist, es sich besser mit Quoting ver-
trägt, und weil keine Verwechslungsgefahr mit Apostroph/Ak-
zentzeichen besteht.

$(()) ist arithmetische Expansion.

Das Skript ermittelt also als erstes den Sekunden-Offset
der aktuellen Uhrzeit. In der Schleife werden dann immer
10 Sekunden darauf addiert (Ziel-Zeit). Das sleep-Komman-
do schläft dann für die Differenz zwischen der Ziel-Zeit
und der aktuellen Zeit. Wenn der fragliche befehl unter-
schiedlich lange braucht, dann paßt sich das sleep also
an.

Eigentlich alles ganz einfach. :)

Gruß
   Olli

PS: Genaugenommen sollte man einen Check hinzufügen, für
den Fall, daß der befehl länger als zehn Sekunden braucht.

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
"Der Einsatz von MS-Mailsystemen ist sehr erfolgreich, aber
leider vor allem bei der Verbreitung von Viren wie Melissa,
Papa oder explore.zip.  Dies ist durchaus auch in der
Architektur dieser Software begruendet."  (unbekannt)
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 23 Apr 2003 - 18:44:47 CEST

search this site