Вопрос или проблема
Когда я запускаю скрипт server.sh
(запускает выделенный сервер Quake) в терминале, он создает такой вывод инициализации:
------- Инициализация игры -------
имя игры: baseqz
дата игры: 25 мая 2016
инициализация списка доступа...
загружено 0 стиме ID в список доступа
Не ведется логирование на диск.
0 команд с 0 сущностями
21 предмет зарегистрировано
А когда кто-то подключается к серверу, то этот скрипт выдает что-то вроде Человек xyz подключился
Я хочу, чтобы supervisor управлял этим server.sh скриптом, но supervisor не выводит никаких сообщений инициализации или сообщений о подключении (если кто-то подключается). Stdout и stderr оба ведут логирование. Почему supervisor не логирует вывод server.sh?
Вот мой supervisord.conf
[program:prog]
command=/home/user/.steam/steamapps/common/qlds/server.sh
stdout_logfile=stdout.txt
stderr_logfile=stdout.txt
[supervisord]
nodaemon=true
[supervisorctl]
serverurl=http://127.0.0.1:9001
[inet_http_server]
port=127.0.0.1:9001
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
ИЗМЕНЕНИЕ:
Я заметил странное поведение server.sh
server.sh &> out.txt
не генерирует никакого вывода в out.txt (нет инициализации игры, ничего). Но только после того, как я ввел в stdin “quit” (server.sh теперь завершает работу), инициализация игры и так далее были записаны в файл out.txt
попробуйте полный путь для стандартных лог-файлов и убедитесь, что права доступа установлены правильно.
stdout_logfile=/abc/stdout.txt
stderr_logfile=/abc/stdout.txt
Ответ или решение
Когда вы сталкиваетесь с проблемой, заключающейся в том, что Supervisor не отображает вывод дочернего процесса, в данном случае скрипта server.sh
, необходимо рассмотреть несколько ключевых моментов, связанных с его конфигурацией и особенностями работы. Ниже приведены некоторые причины и решения для вашей проблемы.
1. Отмена буферизации вывода
Одной из распространенных причин, по которой Supervisor не отображает вывод вашего скрипта, является буферизация вывода. Скрипты, работающие в режиме терминала, обычно используют буферизацию, которая затрудняет передачу данных в режиме реального времени. Это значит, что вывод может не попадать в логи Supervisor сразу, а накапливаться в буфере. Поскольку вы заметили, что вывод появляется только после завершения работы скрипта, это может указывать на то, что вывод не сбрасывается до завершения процесса.
Решение: Попробуйте запустить ваш скрипт с отключенной буферизацией. Для этого можно изменить server.sh
, добавив команду unbuffer
для запуска скрипта:
unbuffer /home/user/.steam/steamapps/common/qlds/server.sh
2. Конфигурация всплывающего вывода
В вашей конфигурации Supervisor вы указали, что вывод stdout
и stderr
должен быть записан в один и тот же файл (stdout.txt
). Если вывод ведется в файл, убедитесь, что наступает правильное событие для записи. Ваша конфигурация для вывода может быть улучшена:
stdout_logfile=/abc/stdout.txt
stderr_logfile=/abc/stderr.txt
Это позволит вам отслеживать потоки стандартного и ошибочного вывода отдельно.
3. Права доступа
Убедитесь, что права доступа к файлу лога (stdout.txt
) и к директории, в которой он находится, установлены правильно. Пользователь, под которым запущен Supervisor, должен иметь возможность записывать в указанные файлы.
4. Параметры запуска
Проверьте, как запускается сам server.sh
. Если в самом скрипте какие-то команды, которые могут производить вывод в терминал напрямую (например, echo
) вместо отсылки его в стандартный поток, это также может быть проблемой. Убедитесь, что все команды внутри скрипта направляют вывод корректно, используя >&1
для стандартного вывода.
5. Проверка пути
Как вы правильно заметили, стоит попробовать указать абсолютные пути для лог-файлов. Иногда использование относительных путей приводит к путанице из-за неправильного определенного рабочего каталога. Например:
stdout_logfile=/полный/путь/к/stdout.txt
stderr_logfile=/полный/путь/к/stderr.txt
6. Использование exit-кодов
Если server.sh
завершает работу с ошибкой или неправильно, это также может повлиять на вывод. Убедитесь, что скрипт ведет себя так, как вы ожидаете, и завершает с правильным кодом возврата.
Заключение
Проблема, с которой вы столкнулись, может быть вызвана сочетанием факторов, включая буферизацию вывода, разрешения на запись, параметры конфигурации и сам код скрипта. Проведение вышеуказанных проверок и экспериментов должно помочь вам решить эту проблему. Если после этого проблема будет сохраняться, возможно, стоит рассмотреть альтернативные методы логирования или подключения для диагностики проблемы.
Если вы будете следовать этим рекомендациям, вы значительно повысите вероятность того, что вывод вашего скрипта окажется в логах Supervisor, что упростит мониторинг и управление вашим сервером.