[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Herausfinden ob ein Rechner neu gebootet wurde



Michelle Konzack schrieb:
> Hallo,
> 
> Gibt es eine möglichkeit, herauszufinden, ob ein Rechner neu gebootet
> wurde?
> 
> Ich habe folgendes Problem:
> 
> Ein Programm wird gestartet und sammelt Daten und schreibt zwei Zahlen
> in eine LOGDATEI welche ich mit einer einmaligne Kennung versehen will,
> z.B. die Boot-Zeit des Systems.
> 
> Nachteil: Ich kann KEINE init Scripts verwenden die beim booten eine
> einmalige ID schreiben (wie "uptimed" zum Beispiel).
> 
> Hat der Kernel etwas verfügbar, was man verwenden könnte?
> 
> Thanks, Greetings and nice Day
>     Michelle Konzack
> 
> 

Hallo Michelle,

die Antwort kommt etwas spät, aber ich komme nicht immer dazu, in den
Listen auf dem Laufenden zu bleiben.

Wir haben hier für unsere Server (RedHat) ein entsprechendes Paket
gestrickt:

Das init-Script startet ein kleines Script, das im Hintergrund ständig
einen Timestamp im System schreibt. Bei Start des Systems wird dann
nachgeschaut, ob ein vorhandener Timestamp veraltet ist und
gegebenenfalls ein Log geschrieben. Dieses Log ist so ausgelegt, daß es
z.B. bei Wartungsarbeiten anschießend vom Admin kommentiert werden kann.
Außerdem kann man bei Bedarf eine Mail versenden. Dabei wird immer die
zugehörige Logzeile übertragen, die man dann auch remote auswerten könnte.

/etc/init.d/auszeit        (auszeit.init)
/etc/sysconfig/auszeit     (auszeit.sysconfig)
/usr/local/sbin/auszeit.sh (auszeit.sh)
/var/log/auszeit.tf        (auszeit.tf)
/var/log/auszeit           (auszeit.log)

Bei Debian wäre der richtige Platz für auszeit.sysconfig wohl
/etc/default/auszeit. Außerdem muß das init-Script wohl etwas angepaßt
werden. Die Intervalle sind auch noch in den Scripten fest programmiert.
Man lönnte sie auch noch in die sysconfig  auslagern... Für RedHat kann
ich auch noch mit einem Spec-File dienen.

Im Log kannst Du dann erkennen, ob das System regulär rebootet wurde,
oder ob es durch Crash oder Powercycle aus der Kurve geflogen ist.

Vielleicht hilft Dir das ja bei deinem Problem.

Gruß
Berthold

#!/bin/bash
#
# Version: 1.4
#
# chkconfig: 2345 20 03
# description: Runs the auszeit-script for detecting crashes
# processname: auszeit
#

# auszeit
#
# Protokolliert Reboot, Shutdown und Crashes
# 
# Schreibt zyklisch Timestamps im laufenden System
#
# ZAIK/RRZK, Universitaet zu Koeln, WZ/CO, 2003

# Source function library.
. /etc/init.d/functions

# get the configuration
if [ -f /etc/sysconfig/auszeit ]; then
  . /etc/sysconfig/auszeit
fi

RETVAL=0
prog=auszeit
ausz=/usr/local/sbin/auszeit.sh
ausztf=/var/log/auszeit.tf
auszlog=/var/log/auszeit

hostname_cmd="/bin/hostname"
date_cmd="/bin/date"
echo_cmd="/bin/echo"
tail_cmd="/usr/bin/tail"

send_mail() {

host=`${hostname_cmd} --short`
date=`${date_cmd}`
message=`${tail_cmd} -1 ${auszlog}`

${echo_cmd} "To: ${receiver}
From: ${sender}
Subject: Ausfall: Rechner ${host} wurde rebootet!

Der Rechner ${host} wurde aus unbekannter Ursache rebootet 
und ist nun (${date}) wieder online.

Siehe /var/log/auszeit auf ${host}:
$message}


*****************************************
* Diese Mail wurde automatisch erzeugt! * 
*****************************************
"|/usr/lib/sendmail -t

}

start() {
	echo -n $"Starting $prog: "
	pidofproc $ausz >/dev/null
	RETVAL=$?
	if [ $RETVAL = 0 ] ; then
	    action $"Starting $prog: " /bin/false
	    exit 1
	fi
	if [ -f $ausztf ] ; then
	    maint=`/bin/cat $ausztf | grep MAINT`
	    if [[ $maint == '' ]] ; then
	      log_message UN xx 'Ausfall unbekannter Ursache'
	      if [ -n "$receiver" ] && [ -n "$sender" ] && [ -n "$SEND_ALERT" ] && [ "$SEND_ALERT" = 'yes' ]; then 
         	send_mail
	      fi
	    else
	      log_message SM xx 'Script durch service wieder gestartet'
	    fi
	fi
	daemon $ausz 300
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && touch /var/lock/subsys/auszeit
	return $RETVAL
}

stop() {
	echo -n $"Stopping $prog: "
	killproc $ausz
	RETVAL=$?
	if [ $RETVAL = 0 ] ; then
	    rm -f /var/lock/subsys/auszeit
	    log_message SM xx 'Script durch service sauber gestoppt'
#	    /bin/rm -f $ausztf
	    echo 'MAINT' >> $ausztf
	fi
	echo
	return $RETVAL
}

log_message() {
	rs=$1
	us=$2
	ms=$3
        da=`/bin/date '+%d. %H:%M'`
        se=`date '+%s'`
	oda=`/bin/cat $ausztf | /bin/grep DA | /usr/bin/cut -b 4-`
	ose=`/bin/cat $ausztf | /bin/grep SE | /usr/bin/cut -b 4-`
	sec=`/usr/bin/expr $se - $ose`
	sec=`/usr/bin/expr $sec + 30`
	min=`/usr/bin/expr $sec / 60`
#	echo -n $oda' - '$da
#	echo -n '     '$min | tail -5c
#	echo ' '$rs' '$us' '$ms
	echo -n $oda' - '$da >> $auszlog
	echo -n '     '$min | tail -5c >> $auszlog
	echo ' '$rs' '$us' '$ms >> $auszlog
}


# See how we were called.
case "$1" in
  start)
        start
	;;
  stop)
        stop
	;;
  test)
	pidofproc $ausz
	echo $?
	;;
  status)
	status $ausz
	RETVAL=$?
	;;
  restart)
	stop
	start
	;;
  *)
 	echo $"Usage: $0 {start|stop|restart|status}"
	exit 1
esac

exit $RETVAL
#Ausfallursachekennnungen sind wie folgt definiert:
#HA - Hardware-bedingter Ausfall
#HM - Ausfall wegen Hardware-Pflegearbeiten
#SA - Software-bedingter Ausfall
#SM - Ausfall wegen Software-Pflegearbeiten
#EN - Ausfall wegen Umwelteinfluessen (Strom, Klima etc.)
#UN - Ausfall unbestimmter Ursache
#
#Zu SM: Gegebenfalls muss der Ausfallzeitraum manuell korrigiert werden.
#
#
#

Attachment: auszeit.sh
Description: application/shellscript

# Set 'SEND_ALERT=yes' if you want to send emails in case 
# of a crash. Default is 'no'
#SEND_ALERT=no
receiver=""
sender=""
DA Mi. 06.12. 12:51
SE 1165405906

Reply to: