Re: Alter einer Datei in Sekunden ermitteln

Autor: Raphael Eiselstein <rabe_at_uugrn.org>
Datum: Sat, 26 Mar 2011 22:45:26 +0100
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_at_uugrn.org>:
> > AGE=$(( $(date +%s) - $(date +%s --date "$(stat --format %y /var/run/filename )") ))"

Das ließ sich sogar noch vereinfachen zu 
AGE=$(( $(date +%s) - $(stat --format %Y /var/run/filename ) ))
(siehe Philipps Mail)


> > Gibts da schönere Lösungen?
> echo $(( $(date +%s) - $(date +%s --reference /var/run/filename) ))

Man könnte 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
Rückgabewert für einen Timeout muss man sich dann noch dazu bauen. 

Also gut: Ein "Watchdog" könnte also so aussehen, ausgehend von der 
Überlegung, dass im Normalbetrieb die Datei /var/run/foo.alive 
mindestens alle 60sec aktualisiert wird und bei Überschreiten 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 könnte es
zum Problem werden, wenn der restart von foo schnell wieder
"zurückkommt", aber im Hintergrund eine Komponente noch 30sec braucht,
bis sie läuft (und die Datei toucht). Hier könnte ein restart-Chaos
entstehen. Um das zu vermeiden wäre ein "touch /var/run/foo.alive" nach
"foo restart" hilfreich, um der Komponente 70sec Zeit zum starten zu
geben. Ansich ein gefährliches Ding, sollte man auf jedenfall gut testen.


Gruß
Raphael
 
-- 
Raphael Eiselstein <rabe@uugrn.org>               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/

Empfangen am 26.03.2011

Dieses Archiv wurde generiert von hypermail 2.2.0 : 26.03.2011 CET