[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Alter einer Datei in Sekunden ermitteln
[Thread Prev] | [Thread Next]
- Subject: Re: Alter einer Datei in Sekunden ermitteln
- From: Raphael Eiselstein <rabe@xxxxxxxxx>
- Date: Sat, 26 Mar 2011 22:45:26 +0100
- To: uugrn@xxxxxxxxxxxxxxx
On Sat, Mar 26, 2011 at 01:36:00PM +0100, Markus Hochholdinger wrote: > Am 25.03.2011 um 23:00 Uhr schrieb Raphael Eiselstein <rabe@xxxxxxxxx>: > > AGE=$(( $(date +%s) - $(date +%s --date "$(stat --format %y /var/run/filename )") ))" Das liess sich sogar noch vereinfachen zu AGE=$(( $(date +%s) - $(stat --format %Y /var/run/filename ) )) (siehe Philipps Mail) > > Gibts da schoenere Loesungen? > echo $(( $(date +%s) - $(date +%s --reference /var/run/filename) )) Man koennte also sagen, dass man die mtime einer Datei in Unix-Sekunden mit GNU Bordmitteln entweder mit date oder mit stat bekommt. Das *Alter* einer Datei muss man dann aber immernoch per Shell "berechnen". Und den Rueckgabewert fuer einen Timeout muss man sich dann noch dazu bauen. Also gut: Ein "Watchdog" koennte also so aussehen, ausgehend von der Ueberlegung, dass im Normalbetrieb die Datei /var/run/foo.alive mindestens alle 60sec aktualisiert wird und bei Ueberschreiten von ca 70-80sec eingegriffen werden muss (aber nur dann): ------------------------------------------------------ #! /bin/bash fileage_timeout() { FILE_NAME="${1}" MAX_AGE="${2:-"65"}" test ! -e "${FILE_NAME}" && return 3 test ${MAX_AGE} -lt 0 && return 2 FILE_AGE=$(( $(date +%s) - $(stat --format %Y "${FILE_NAME}" ) )) if [ ${FILE_AGE} -ge ${MAX_AGE} ]; then # timed out return 0 else # not timed out return 1 fi } while true; do while sleep 10; do fileage_timeout /var/run/foo.alive 70 && break done notify foo restart done ------------------------------------------------------ (script ungetestet, hab grad kein GNU-Linux zur Hand) Man muss bei solchen Konstrukten allerdings aufpassen. Hier koennte es zum Problem werden, wenn der restart von foo schnell wieder "zurueckkommt", aber im Hintergrund eine Komponente noch 30sec braucht, bis sie laeuft (und die Datei toucht). Hier koennte ein restart-Chaos entstehen. Um das zu vermeiden waere ein "touch /var/run/foo.alive" nach "foo restart" hilfreich, um der Komponente 70sec Zeit zum starten zu geben. Ansich ein gefaehrliches Ding, sollte man auf jedenfall gut testen. Gruss Raphael -- Raphael Eiselstein <rabe@xxxxxxxxx> http://rabe.uugrn.org/ xmpp:freibyterægmx.de | https://www.xing.com/profile/Raphael_Eiselstein GnuPG: E7B2 1D66 3AF2 EDC7 9828 6D7A 9CDA 3E7B 10CA 9F2D .........|.........|.........|.........|.........|.........|.........|.. -- UUGRN e.V. http://www.uugrn.org/ http://mailman.uugrn.org/mailman/listinfo/uugrn Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste Archiv: http://lists.uugrn.org/