Журнал службы пуст, хотя приложение работает
Программы буферизуют вывод, когда он идёт не в терминал. У службы вывод идёт в журнал, поэтому строки появляются не сразу, а порциями — а при падении могут потеряться вовсе.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Вывод буферизуется по блокам
Стандартная библиотека переключается на блочную буферизацию, когда вывод не в терминал. Строки копятся до заполнения буфера.
-
Приложение пишет в свой файл, а не в поток вывода
Тогда журнал systemd честно пуст: сообщения идут в другое место.
-
Вывод отключён параметром
Значение
nullотбрасывает вывод целиком. При разборе это выглядит как молчащая служба.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Появляется ли вывод в реальном времени.
journalctl -u myapp.service -fКуда идёт вывод и отключена ли буферизация.
systemctl show myapp.service -p StandardOutput -p StandardError -p EnvironmentРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Стандартная библиотека переключается на блочную буферизацию, когда вывод не в терминал. Строки копятся до заполнения буфера.
- Как проверить
-
Посмотрите, появляется ли вывод при работе.
journalctl -u myapp.service -f --no-pager | head -5
- Как исправить
-
Отключите буферизацию в приложении: для Python это переменная окружения, для многих программ — ключ запуска.
[Service] Environment=PYTHONUNBUFFERED=1
- Почему происходит
- Тогда журнал systemd честно пуст: сообщения идут в другое место.
- Как проверить
-
Посмотрите настройки вывода приложения.
systemctl show myapp.service -p StandardOutput sudo ls -l /var/log/myapp/ 2>/dev/null
- Как исправить
- Либо читайте собственный файл приложения, либо переведите его на вывод в поток: журнал systemd даёт метки времени и фильтрацию.
- Почему происходит
- Значение
nullотбрасывает вывод целиком. При разборе это выглядит как молчащая служба.
- Как проверить
-
Посмотрите параметры вывода.
systemctl show myapp.service -p StandardOutput -p StandardError
- Как исправить
- Верните вывод в журнал хотя бы на время разбора.
Пример вывода
Вывод приложения копится в буфере. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ journalctl -u myapp.service -n 5 --no-pager
systemd[1]: Started myapp.service - My application.
# больше ничего, хотя приложение обрабатывает запросы
$ systemctl show myapp.service -p Environment -p StandardOutput
Environment=
StandardOutput=null
Связанные ошибки
- Failed to start … — что делать с общим сообщением Строка Failed to start сообщает только факт. Порядок разбора: найти настоящую причину выше по журналу.
- status=209/STDOUT в systemd Код 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
- Журнал пропадает после перезагрузки journalctl не показывает записи прошлых загрузок: журнал хранится только в памяти. Как включить постоянное хранение.
- Python-служба: ModuleNotFoundError при запуске Служба не находит модули: другое виртуальное окружение, неверный интерпретатор, отсутствующие зависимости.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
Источники
-
systemd.exec(5)
StandardOutput= и вывод службы в журнал. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено приложением на python без отключения буферизации.