[gelöst] WatchDog oder abhängige Deamons - gibt es sowas in Linux?

cando

Aktives Mitglied
Mitglied seit
28 Nov 2008
Beiträge
1,080
Punkte für Reaktionen
0
Punkte
0
Ich habe da noch eine Frage an die Linux Experten.

Ich muss irgendwie sicherstellen, dass mein Hintergrundprozess zum Loggen abgeschossen wird, sobald der cron nicht mehr läuft, damit die Ramdisk nicht vollgeschrieben wird. Aus dem UI kann ich leicht dafür sorgen, da ich den Dienst ja selbst kontrollieren kann.

Das Problem entsteht, wenn jemand den Cron direkt mit kill platt macht oder aber über die freetz Funktion stop Crond.

Mit dem cron könnte man ja einen Watchdog basteln, aber wenn der weg ist - bringt das nichts. Eigentlich müsste das beenden des cron ein Kill auf meinen Deamon auslösen.

Gibt es eine elegante Lösung dafür?

Sonst müsste ich mir eine Basteln (z.B.
im cron script:

kill watchdog
...Verarbeite Log
start Watchdog im Hintergrund.

und der Watchdog:
sleep 300
kill mein Prozess

so dass nach 5 Minuten kein "cron-job" der Logger plattgemacht wird.

Das würde auch das Problem lösen, wenn jemand mutwillig den cron job killt oder die Zeit zu stark verlängert.

Aber vielleicht kennt Ihr ja eine bessere Methode mit Systemmitteln?
 
Zuletzt bearbeitet:
Ich verstehe nicht so ganz, was du bezwecken willst. Cron funktioniere übrigens auch nicht mehr wie er soll, wenn jemand ihn umkonfiguriert...
 
Hallo Cuma.

Ich habe mir nun eine eigene Lösung gebaut. Ich beschreibe mal das Problem:

der Log Dienst
Code:
cat /dev/debug > /var/tmp/system.log &
sammelt alles ein, was AVM nicht zum syslog durchläßt (wichtige Meldungen und eine ganze Menge DECT Schrott). Dort versickern auch die iptables Logs.

ich habe es in die RAM-Disk gelegt, weil es dort am schnellsten ist, und ich mache bewußt kein grep etc, damit der zeitkritische DECT Prozess nicht gebremst wird.

Dann hatte ich einen Job im Cron, der jede Minute den Puffer im system.log verarbeitet und leert. Maximal kommen dort in einer Minute so um die 700k zusammen, wenn man mit 2 DECT Geräten gleichzeitig eine Verbindung aufbaut.

Das funktioniert auch alles super, solange niemand auf die Idee kommt den cron zu stoppen. Dann wächst nämlich die Pufferdatei immer weiter.

----

Meine Lösung nun ist ein eigener deamon mit einer Loop, die den Logprozess startet und alle 15 Sekunden den Puffer auswertet und leert. wenn der logprozess nicht mehr in PS ist, beendet sich der deamon selbst.

Der Logprozess seinerseits hat eine Prüfung, ob der watchdog (mit der Loop) läuft, wenn nein, dann beendet er sich gleich, bevor er /dev/debug umleitet, ausserdem prüft er, ob bereits eine andere Instanz von ihm läuft und verhindert so 2 deamons gleichzeitig.

----

Damit bin ich das Problem mit dem crond prinzipiell los, da ich den nun nicht mehr benutze, auch das Log Problem, dass der cron bei jedem Aufruf eines jobs eine Pseudo-Fehlermeldung im Syslog schreibt, trifft mich nicht mehr.

Es wäre aber trotzdem schön (Verbesserungsvorschlag), wenn man in Freetz den crond konfigurieren könnte, wohin er logt (syslog, Datei, /dev/null)

That's one small patch for a developer, one giant leap for mankind

;)
 
Eigentlich müsste das beenden des cron ein Kill auf meinen Deamon auslösen.

Da beide Prozesse zunächst nichts miteinander zu tun haben, wird in der Richtung automatisch nichts passieren.

Du kannst folgendes probieren:
Code:
while kill -0 $$ 2> /dev/null; do 
  if [ -z "$(pidof crond)" ]; then
    kill $$ 2> /dev/null
    sleep 5
    kill -9 $$ 2> /dev/null
    exit
  fi
  sleep 60
done &
exec cat /dev/debug > /var/tmp/system.log
Das sleep-Intervall ist ggf. anzupassen.
Ich habe das Prinzip mit einem einfachen Beispiel getestet.
Das Skript ist im Prinzip sein eigener Watchdog. Die Schleife oben läuft im Hintergrund solange wie das Vordergrund-Programm läuft. Wenn crond nicht mehr läuft, wird das Vordergrund-Programm gestoppt, erst mit normalem kill und dann mit -9. Du solltest beachten, daß pidof alle Prozesse durchsucht und nicht allzu häufig aufgerufen werden sollte.
Das Skript selbst mußt Du im Hintergrund aufrufen.
 
Ich hab das mal als Hintergrund-Watchdog so gelöst:

Code:
#!/bin/sh

   running=$(ps | grep -v grep | grep -o iptlogger)
   if [ -z $running ]
   then
      echo "starting log deamon"
      sh /var/tmp/iptlogger.sh
      myexit=0
      while [ $myexit -eq 0 ]
      do
         sleep 15
         running=$(ps | grep -v grep | grep -o iptlogger)
         if [ -z $running ]
         then
            echo "terminating log deamon"
            myexit=1
         else
            grep -E -v "<4>|DECT|DCT|^$" /var/tmp/system.log | sed "s/^/$(date +'%Y-%m-%d %H:%M:%S') /" >> /var/media/ftp/uStor01/log/system.log
            grep "<4>" /var/tmp/system.log | sed "s/^/$(date +'%Y-%m-%d %H:%M:%S') /" >> /var/media/ftp/uStor01/log/fw.log
            echo "" > /var/tmp/system.log
            myexit=0
         fi
      done
else
   echo "already running, giving up"
fi

und das ist der log-deamon:
Code:
#!/bin/sh

running=$(ps | grep -v grep | grep -o iptlogger)
if [ -n $running ]
then
    exit 1
fi
running=$(ps | grep -v grep | grep -o logfw)
if [ -z $running ]
then
    exit 2
fi
cat /dev/debug > /var/tmp/system.log &

Das verhindert doppeltes starten und Start ohne Watchdog und der crond ist überfüssig, da die schleife vom Watchdog für die Verarbeitung reicht. Wahrscheinlich kann man es efektiver Programmieren mit weniger Zeilen, aber die shell syntax ist mir noch nicht so vertraut, ich bin schon froh, wenn es das macht, was ich will...
 
Also ich hab das noch eleganter. Nimm meinen SyslogPatch aus dem Ticket, lass Syslog in eine beliebige Datei schreiben und: Fertig!
Das sieht dann so aus:
Code:
Nov  4 23:31:05 kernel: SSH: IN=dsl OUT= MAC= SRC=124.254.14.153 DST=169.254.2.1 LEN=48 TOS=0x00 PREC=0x00 TTL=113 ID=8821 PROTO=TCP SPT=25189 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 
Nov  4 23:35:58 kernel: SSH: IN=dsl OUT= MAC= SRC=202.75.63.50 DST=169.254.2.1 LEN=60 TOS=0x00 PREC=0x00 TTL=52 ID=9026 DF PROTO=TCP SPT=53259 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0 
Nov  4 23:36:01 kernel: SSH: IN=dsl OUT= MAC= SRC=202.75.63.50 DST=169.254.2.1 LEN=60 TOS=0x00 PREC=0x00 TTL=52 ID=9027 DF PROTO=TCP SPT=53259 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0
 
Werde ich mal beim nächsten Firmware Flashen testen, vielen Dank...

Ich hatte vorigen Winter den printk - Patch eingespielt und viel Ärger damit gehabt. Hoffentlich ist das Problem hiermit Geschichte.

Da ich nun den "eigenen" Logger drin hab, werde ich den mal drin lassen, für alle ohne Patch oder ohne syslogd.

Mit dem Patch lässt man die eingebaute Log-Mimik einfach aus, dann sollte der syslogd / klogd den Job erledigen und alles im Syslog sammeln (oder in einer Datei, wenn man den syslog.conf irgendwo editieren kann).

Ich melde mich, sobald ich das mal getestet habe!
 
Also bei mir funktioniert der seit ich den im Track gepostet hatte, auch mit meinem 2 DECT-Telefonen
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.