Asterisk: Spawn extension failed - Priority out of range (Ошибки pbx.c)
- В журнале вызовов фиксируется
WARNING[7890]: pbx.c: Spawn extension failed: Priority out of range (priority 5 in 'from-internal', exten '100'). - Звонок внезапно прерывается в середине выполнения логики диалплана.
- Функция
Goto()илиGotoIf()ссылается на несуществующий порядковый номер шага (приоритет). - Команда
dialplan showуказывает на пропуски в нумерации строк диалплана.
1. Анализ трассировки вызова в Asterisk CLI
asterisk -vvvvvr
core set verbose 5
core set debug 32. Проверка порядка приоритетов в extensions.conf
Классическая ошибка — использование жестких номеров приоритетов с пропусками:
; ОШИБОЧНАЯ КОНФИГУРАЦИЯ:
exten => 100,1,Answer()
exten => 100,2,Playback(welcome)
exten => 100,5,Dial(PJSIP/101) ; Ошибка: нет приоритетов 3 и 4!3. Рефакторинг диалплана на использование unnumbered same => n
Перепишите контекст с использованием относительных приоритетов same => n и строковых меток (labels):
[from-internal]
exten => 100,1,NoOp(Старт вызова)
same => n,Answer()
same => n,Playback(welcome)
same => n,GotoIf($["${DEVICE_STATE(PJSIP/101)}" = "UNAVAILABLE"]?offline:online)
same => n(online),Dial(PJSIP/101,20)
same => n,Hangup()
same => n(offline),Playback(user-offline)
same => n,VoiceMail(101@default,u)
same => n,Hangup()4. Проверка синтаксиса диалплана и перезагрузка
asterisk -rx "dialplan show 100@from-internal"
asterisk -rx "dialplan reload" Частые вопросы (FAQ)
Почему нельзя использовать жесткую нумерацию приоритетов (1, 2, 3...)?
При добавлении новых строк в середину контекста жесткая нумерация требует ручного переписывания всех последующих цифр. Любая ошибка в последовательности приводит к 'Priority out of range'.
Что означает конструкция same => n(label)?
same означает продолжение предыдущего экстеншена; n — автоматический инкремент следующего приоритета (+1); (label) — именованная текстовая метка для безопасных переходов через Goto.
Как синтаксически правильно вызывать Goto по метке?
Синтаксис: Goto([context,][extension,]priority/label). Пример внутри одного экстеншена: Goto(offline) или для другого номера: Goto(from-internal,102,start).
Что происходит при возврате функции n+101 в старых версиях Asterisk?
В устаревших версиях при занятости вызываемого абонента Dial() переходил на приоритет n+101. В современных версиях это поведение отключено, а статус проверяется через переменную ${DIALSTATUS}.