Часть 1: Миграция сервера на Linux (Пошаговый алгоритм)
Большинство разработчиков создают и тестируют свои игровые моды на локальных компьютерах под управлением ОС Windows. Однако запуск сервера в режиме продакшена (для реальных игроков) требует стабильности, безопасности и высокой производительности, которые может обеспечить только операционная система семейства Linux (Ubuntu, Debian, CentOS), установленная на мощностях игрового хостинга.
Процесс миграции сервера с Windows на Linux, а также последующий поиск причин падения игрового движка часто вызывают трудности у начинающих администраторов. В данном руководстве мы разберем, как правильно перенести сервер без потери данных и как локализовать любые краши кода.
Главные архитектурные различия
Главное архитектурное различие между Windows и Linux, которое ломает работу сервера SA:MP/CRMP — это чувствительность к регистру символов (Case Sensitivity) в названиях файлов и путях, а также использование разных форматов динамических библиотек (плагинов).
Шаг 1: Замена плагинов (.dll на .so)
Операционная система Linux не умеет работать с翻лами динамических библиотек формата .dll. Для нее требуются файлы общего объекта с расширением .so.
- Скачайте Linux-версии всех плагинов, которые использует ваш мод (например:
Crashdetect,MySQL,Streamer,DC_CMD,Pawn.RakNet). Их можно найти на официальных страницах разработчиков на GitHub. - Загрузите файлы с расширением
.soв папкуplugins/на вашем хостинге через SFTP. - Откройте конфигурационный файл
server.cfgв текстовом редакторе панели управления и найдите строкуplugins. Замените названия файлов.
Пример для Windows: plugins sscanf.dll mysql.dll streamer.dll
Правильный вариант для Linux: plugins sscanf.so mysql.so streamer.so (в некоторых современных версиях SA:MP допускается указывать плагины вообще без расширения, система подставит нужное автоматически).
Шаг 2: Исправление регистра букв (Case Sensitivity)
Если в Windows файлы Scriptfiles/Users/Player.ini и scriptfiles/users/player.ini — это один и тот же файл, то для Linux это два абсолютно разных пути. Если ваш скрипт обращается к папке с маленькой буквы, а на диске она создана с большой, сервер выдаст ошибку или не сможет сохранить данные игрока.
- Приведите названия всех ключевых папок (
gamemodes,filterscripts,scriptfiles,plugins) к нижнему регистру. - Проверьте внутренний код мода (Pawn): пути в функциях
fopen(),fexist(),db_open()должны строго соответствовать реальному написанию папок на сервере хостинга.
Часть 2: Отладка крашей сервера с помощью Crashdetect
Если сервер SA:MP запускается, но внезапно закрывается («падает») во время игрового процесса, стандартный лог server_log.txt редко бывает информативным — обычно он просто обрывается. Чтобы понять, какая именно строчка в Pawn-скрипте вызвала критическую ошибку, необходимо использовать плагин Crashdetect.
Шаг 1: Компиляция мода с отладочными символами
По умолчанию компилятор Pawn (pawncc.exe) сжимает код и удаляет из готового файла .amx информацию о строках кода. Чтобы Crashdetect мог указать точное место ошибки, мод нужно перекомпилировать со специальным флагом.
- Открыть ваш редактор кода (Pawno, Visual Studio Code или Sublime Text).
- В параметрах компилятора добавьте флаг
-d3. - Перекомпилируйте ваш игровой мод. Размер результирующего файла
.amxувеличится — это нормально, так как внутрь запишутся отладочные символы. Загрузите новый.amxна хостинг.
Важно: Использование флага -d3 не снижает производительность сервера в реальных условиях, но позволяет получить детальный стек вызовов при падении.
Шаг 2: Анализ логов Crashdetect
После установки плагина и компиляции с флагом -d3, в случае краша сервера, в лог-файл запишется детальный отчет (Backtrace). Рассмотрим пример типичной ошибки:
[14:22:10] [crashdetect] Crash detected while executing mygamemode.amx
[14:22:10] [crashdetect] AMX backtrace:
[14:22:10] [crashdetect] #0 native PlayerPlaySound () from samp-server
[14:22:10] [crashdetect] #1 in public OnPlayerDisconnect (playerid=5, reason=1) at gamemodes/mygamemode.pwn:1432
[14:22:10] [crashdetect] Run time error 4: "Array index out of bounds" (Array size 50, index 55)
Как прочитать этот лог:
| Элемент лога | Что это означает |
|---|---|
Run time error 4... |
Тип ошибки. В данном случае: Выход за пределы массива. Скрипт попытался записать или прочитать ячейку под номером 55 в массиве, размер которого всего 50 ячеек. |
at mygamemode.pwn:1432 |
Указывает на точную строку (1432) в вашем исходном коде, где произошел сбой. |
in public OnPlayerDisconnect |
Автовызываемая функция (колбэк), внутри которой выполнялся код в момент падения сервера. |
Частые причины крашей на хостинге
- Бесконечные циклы (Server freezing): Если вы некорректно настроили цикл
whileилиfor, который не имеет условий выхода, поток сервера зациклится. Хостинг зафиксирует 100% нагрузку на процессор, сервер перестанет отвечать на сетевые запросы ("зависнет") и будет принудительно перезапущен сторожевым таймером панели хостинга. - Утечки памяти в MySQL: Использование функции
cache_get_row_count()или создание тяжелых неоптимизированных SQL-запросов в цикле без последующей очистки памяти (cache_deleteв старых версиях плагина) постепенно забивает выделенную RAM. Когда лимит оперативной памяти контейнера на хостинге исчерпывается, процесс сервера моментально уничтожается операционной системой (ошибка Out Of Memory / OOM Killer).
Совет: Всегда держите плагин Crashdetect включенным даже на готовом игровом сервере. Он промежуточно потребляет ничтожно мало ресурсов, но экономит часы работы при поиске багов после выпуска очередного обновления игрового мода.