Asterisk: Reanimation in Highspeed

asterisk_project

Ob das nun an der von mir genutzten Version liegt oder – und diese Vermutung habe ich – daran dass ein Nutzer irgendetwas “drückt” was dem Prozess das Genick bricht – es gibt hier und da einen Absturz des Asterisk Prozesses (meist Segfaults). Ich setze zur Zeit die Version 1.8.7 ein, plane jedoch auf 1.8.20 zu gehen. Möglicherweise ist das Problem dann auch behoben.

Und bis dahin?

Ja, bis dahin muss das System irgendwie so konfiguriert sein, dass die Schäden bzw. die Außenwirkung recht klein gehalten wird. Nun könnte man ein Script schreiben, welches den Prozess prüft und ggf. neu startet. Oder das ganze an das Monitoring übergeben und über ein Event den Dienst vom Monitoring neu starten lassen. Alles möglich … aber meiner Meinung nach zu kompliziert und auch nicht Zielführend. Warum? Ich möchte, dass der Dienst SOFORT wieder gestartet wird. Das ganze über Monitoring zu machen (egal ob lokal oder remote) bedeutet, dass ich immer maximal eine Minute habe, bis dass das System den Ausfall bemerkt.

So ähnlich wie …

Es gibt bereits ein fertiges Script, welches so was in der Richtung macht wie ich es mir vorgestellt habe. Das ganze ist ein Wrapper um den Asterisk Prozess herum. Wrapper? Naja, ein einfaches Bash Script welches den Asterisk Prozess innerhalb eines Loops startet. Wird der Prozess beendet, startet er über den Bash Loop sofort wieder.

Das Problem dabei ist, dass – bei einem Problem – der Prozess immer und immer wieder gestartet wird. Fällt er beim Start auf die Nase, so wird er trotzdem immer und immer wieder gestartet. Am Ende kann das fatal sein.

So hab ich das gemacht …

Warum sich nicht vorhanden Mechanismen bedienen. Es gibt da was, das ist seit gefühlten 100 Jahren im Einsatz und macht seinen Dienst perfekt – ok, es wird zur Zeit so langsam abgelöst, aber das ist jetzt mal egal. Wovon ich spreche? Der Init Prozess.

Mit Hilfe der inittab ist es möglich Prozesse in definierten runlevel zu starten und – was uns interessiert – quasi zu überwachen. Der Init Prozess startet den Prozess und sobald dieser beendet wird, startet er ihn sofort wieder. Genau das brauchen wir, damit der Asterisk bei einem Crash sofort wieder zur Verfügung steht. Dabei sind dann natürlich die aktuellen Gespräche weg, jedoch kann sofort wieder telefoniert werden ohne dass jemand erst etwas tun muss oder ein Monitoring Prozess das ganze prüft.

Wie sieht das nun in der inittab aus?

Ganz einfach:


as:2:respawn:/usr/sbin/asterisk -f -U asterisk

Aber Vorsicht! Der Asterisk darf bei der Umstellung auf die Inittab nicht laufen. Ansonsten versucht der Init Prozess Asterisk zu starten, was nicht möglich ist. Er wird das ein paar Mal versuchen und dann eine Karenzzeit warten, bis er das ganze wieder versucht.

Nach der Änderung der inittab mit “init q” die inittab neu einlesen. Dabei wird dann der Prozess ggf. gestartet. Vorsicht ist auch geboten bei Wartungsarbeiten – man sollte daran denken, dass der Asterisk Prozess nicht einfach so gestoppt werden kann ;-) Vorher die Zeile auskommentieren und über “init q” die inittab neu einlesen.

2 Responses to Asterisk: Reanimation in Highspeed

  1. postlet

    So manchmal … Sind solche Sachen erschreckend einfach. Aber wo ich das gerade im Planet von ubuntuusers.de lese, das wird vermutlich mit Upstart in Ubuntu etwas anders funktionieren?

    • Ronny

      Das wird unter upstart bestimmt anders laufen. Kann Dir allerdings nicht sagen wie. Meine Server sind alle noch “oldstyle” ;-)

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>