Вопрос или проблема
У меня есть процесс, который я написал и который выводит несколько строк в stdout при запуске:
Удаленный входной демон запускается...
Создание устройства evdev... выполнено.
Заполнение списка клавиш... выполнено.
Настройка сокета для прослушивания... выполнено.
Прослушивание на 0.0.0.0:8063...
…и они отображаются с помощью fprintf:
fprintf(stdout, "Удаленный входной демон запускается...\r\n");
Однако systemd не отображает их, как и journalctl. Что я делаю не так?
Вот мой файл юнита:
[Unit]
Описание=Демон службы удаленного ввода
[Service]
ExecStart=/home/sofakng/Applications/Distrobox/risd/risd
StandardOutput=journal
[Install]
WantedBy=default.target
.
Ответ или решение
Вопрос о том, почему процесс, управляемый systemd, не записывает стандартный вывод (stdout) в журнал с использованием journald, является распространенной проблемой среди разработчиков. Давайте разберем это по шагам.
1. Проверка конфигурации unit-файла
Представленный вами unit-файл выглядит корректно, с явной установкой StandardOutput=journal
. Это означает, что все выводы, сохраняемые в стандартный вывод вашего приложения, должны быть записаны в системный журнал.
2. Проверка обработки вывода
Использование функции fprintf(stdout, "Remote Input Daemon starting...\r\n");
на первый взгляд также не вызывает вопросов. Однако стоит уточнить некоторые моменты.
- Буферизация stdout: В стандартном выводе данные могут кэшироваться. Это означает, что некоторые строки могут не отображаться в журнале, если буфер не очищен. Чтобы убедиться, что вывод появляется немедленно, можно использовать функцию
fflush(stdout);
после каждого вызоваfprintf
. Это заставит буфер вывода быть немедленно записанным.
3. Уровень журналирования
Возможен также сценарий, когда уровень журналирования не настроен таким образом, чтобы включать вывод вашего процесса. Вы можете проверить уровень сообщений, используемых вашим сервисом, и установить StandardError
тоже на journal
, если необходимо.
4. Проверка условий выполнения
Убедитесь, что ваш сервис действительно запускается. Вы можете использовать команду systemctl status your-service-name.service
для проверки статуса вашего сервиса. Если служба не запускается или завершает работу с ошибками, это также может объяснять отсутствие записей.
5. Проверка конфигураций journald
Может быть, были внесены настройки системы или конфигурации journald, которые ограничивают запись журналов. Проверьте файл конфигурации /etc/systemd/journald.conf
, чтобы убедиться, что у вас нет ограничений по уровням журналов.
6. Устранение неполадок
Советуем попробовать следующие команды для диагностики:
- Запустите
journalctl -xe
для просмотра последних записей в журнале, включая сообщения об ошибках. - Проверьте, выводит ли ваша программа какие-либо ошибки при выполнении. Если ваш демон завершается с ошибкой до того, как успевает произвести вывод, это может объяснить, почему вы ничего не видите.
Пример обновленного кода
Вот ваш код с добавлением fflush(stdout);
:
fprintf(stdout, "Remote Input Daemon starting...\r\n");
fflush(stdout);
Заключение
Недостаток вывода в журнал systemd может быть вызван несколькими причинами, но, скорее всего, это связано с буферизацией стандартного вывода, или с тем, что служба не запускается должным образом. Следуя приведенным рекомендациям и рекомендациям по устранению неполадок, вы сможете выявить источники проблемы и добиться корректной работы вашего журнала. Если проблемы сохраняются, детально исследуйте логи и состояние сервиса, и не забудьте проверять реакции системы на изменения в коде.