Asterisk aus dem Dialplan in FreePBX neu starten
In unserem vorherigen Beitrag Aktion bei Anruf einer benutzerdefinierten Nebenstelle in FreePBX hinzufügen haben wir gezeigt, wie man dies erreicht. Außerdem haben wir in unserem Beitrag über Asterisk in FreePBX neu starten die drei verschiedenen Optionen zum Neustart von Asterisk untersucht, z.B. core restart gracefully.
In diesem Beitrag fügen wir eine Dialplan-Nebenstelle (d.h. eine Nummer, die Sie anrufen können) hinzu, die Asterisk neu startet. Dies wird FreePBX nicht neu starten, sondern Asterisk selbst vollständig neu starten (und nicht nur neu laden), wobei alle neuen Konfigurationsoptionen geladen und z.B. alle SIP-Trunks neu initialisiert werden. In diesem Fall verwenden wir core restart gracefully, d.h. wir warten, bis alle aktuell aktiven Anrufe beendet sind, aber lassen keine neuen Anrufe zu.
Fügen Sie diesen Block zu /etc/asterisk/extensions_custom.conf hinzu (siehe Aktion bei Anruf einer benutzerdefinierten Nebenstelle in FreePBX hinzufügen):
[from-internal-additional-custom]
exten => 999999,1,Answer()
exten => 999999,n,Wait(0.5)
exten => 999999,n,SayAlpha(OK)
exten => 999999,n,System(bash -c "sleep 1 && asterisk -rx 'core restart gracefully'" &)
exten => 999999,n,Hangup()Laden Sie Asterisk neu und jetzt können Sie 999999 anrufen, um Asterisk neu zu starten
Wie es funktioniert
Im Wesentlichen lesen wir OK zum Benutzer und führen dann
System(bash -c "sleep 1 && asterisk -rx 'core restart gracefully'" &)aus. Im Grunde könnte man denken, wir kommen mit nur
System(asterisk -rx 'core restart gracefully')hin. Dies wird jedoch fehlschlagen (oder zumindest den Neustart um etwa eine Minute verzögern), da der Anruf, der den Neustart initiiert, noch läuft. Auch können wir System() nicht nach Hangup() ausführen, da Hangup() den Dialplan beendet und System() daher nie ausgeführt wird. Daher führen wir es mit einer Verzögerung (sleep 1) im Hintergrund (& am Ende des Befehls) aus, was Asterisk dazu veranlasst, zuerst den Anruf sauber aufzulegen und dann den Befehl auszuführen.
Beachten Sie, dass das Hintergrund-& am Ende absolut unerlässlich ist; das Weglassen führt dazu, dass Asterisk einfach auf den Abschluss des sleep 1 && asterisk ...-Befehls wartet, anstatt dazwischen Hangup() auszuführen.
Die Verwendung von bash -c zum Ausführen des Befehls ist nur ein Workaround, damit wir die mehreren verketteten Befehle sleep 1 && asterisk ... in einen einzelnen Befehl packen können, den wir im Hintergrund mit dem abschließenden & ausführen können.