Asterisk: loader.c Module res_pjsip.so already loaded, ignoring duplicate
- Предупреждение в логах:
WARNING: loader.c: Module 'res_pjsip.so' already loaded, ignoring duplicate. - Увеличение времени старта Asterisk при инициализации модулей.
- Потенциальные конфликты порядка инициализации зависимых библиотек PJProject.
1. Аудит конфигурационного файла /etc/asterisk/modules.conf
Откройте modules.conf и найдите повторяющиеся строки вызова модулей:
[modules]
autoload = yes
; Ошибка: одновременный preload и последующий load при включенном autoload
preload => res_pjsip.so
load => res_pjsip.so ; <-- УДАЛИТЬ ДУБЛИКАТ2. Оптимизация схемы загрузки модулей
Используйте чистую структуру конфигурации:
[modules]
autoload = yes
; Предварительная загрузка только строго критичных компонентов
preload => res_pjproject.so
preload => res_pjsip.so
; Явное отключение ненужных драйверов
noload => chan_sip.so
noload => chan_skinny.so
noload => chan_unistim.so
noload => chan_mgcp.so3. Проверка загруженных модулей в Asterisk CLI
asterisk -rx "module show like res_pjsip"Убедитесь, что каждый модуль присутствует в списке ровно один раз со статусом Running.
4. Проверка прав и символических ссылок в /usr/lib/asterisk/modules/
ls -la /usr/lib/asterisk/modules/ | grep res_pjsipУбедитесь в отсутствии дубликатов модулей с разными именами (например, кастомных бэкапов res_pjsip.so.bak внутри каталога модулей).
Частые вопросы (FAQ)
Приводит ли предупреждение о дубликате модуля к сбою PBX?
Нет, Asterisk перехватывает повторную попытку загрузки и безопасно игнорирует ее. Однако это признак некорректной конфигурации modules.conf, способной повлиять на порядок инициализации зависимостей.
Зачем нужна директива preload в modules.conf?
Директива preload форсирует загрузку модуля до инициализации общего пула autoload, что критично для библиотек crypto, логирования и сетевых ядер.
Что произойдет, если установить autoload = no?
Asterisk загрузит исключительно те модули, которые явно указаны через директиву load =>. При пропуске хотя бы одной зависимости запуск завершится ошибкой.
Как выгрузить конкретный модуль из памяти на лету?
Выполните в CLI команду: module unload <имя_модуля.so> (например, module unload chan_alsa.so).