Вопрос или проблема
Я запускаю пользовательские службы в Ubuntu 16.04 LTS. Например, мой файл test.service расположен по адресу ~/.config/systemd/user/test.service
.
Мне удалось запустить службу, выполнив
systemctl --user start test.target
Однако, когда я пытаюсь прочитать её журнал с помощью journalctl
, я получаю следующее сообщение об ошибке:
journalctl --user -u test.service
Подсказка: Вы в настоящее время не видите сообщения от других пользователей и системы. Пользователи группы 'systemd-journal' могут видеть все сообщения. Используйте -q, чтобы отключить это уведомление.
Журнальные файлы не были открыты из-за недостатка прав.
Как я могу использовать journalctl
для конкретного юнита пользователя?
В старых версиях systemd вам нужно использовать journalctl --user --user-unit=ИМЯ_СЕРВИСА
(в новых версиях journalctl --user -u ИМЯ_СЕРВИСА
будет работать нормально).
Однако это будет работать только в том случае, если директива Storage
секции [Journal]
файла /etc/systemd/journald.conf
установлена на persistent
(вместо auto
или volatile
). Перезагрузите систему после редактирования конфигурационного файла, и пользователь сможет видеть журнал.
Дополнительная информация:
https://www.freedesktop.org/software/systemd/man/journald.conf.html
https://lists.freedesktop.org/archives/systemd-devel/2016-October/037554.html
sudo usermod -a -G systemd-journal $USER
или
sudo usermod -a -G adm $USER
Ссылка: https://wiki.archlinux.org/title/Users_and_groups#User_groups
Мне не удалось заставить это работать с --user
и другими подобными параметрами. Однако я могу видеть данные, когда использую journalctl
самостоятельно. Там есть все логи, хотя. Я могу искать именно то приложение, которое меня интересует, и смотреть на этот вывод. Чтобы найти последнее, я сначала перехожу в конец файла, а затем ищу назад:
-
Нажмите G, чтобы перейти в конец (это заглавное
G
) -
Нажмите ? и введите название вашего приложения
Это не так удобно, но на устройстве, с которым я работаю (платформа Jetson), это был практически единственный способ, который я нашёл, чтобы это сработало.
Я должен был сделать следующее:
# mkdir /var/log/journal
# systemd-tmpfiles --create
# journalctl --flush
После этого journalctl --user -u СЕРВИС
работает для меня (RHEL 8.9)
Источник: https://github.com/systemd/systemd/issues/16141#issuecomment-642628111
Вы можете создать сценарий bash, который запускает sudo journalctl
с определенным параметром, защитить этот сценарий от записи, предоставить специфические права на выполнение этого сценария как sudo без пароля.
Добавьте запись в /etc/sudoers
, например
ALL ALL = NOPASSWD: /etc/show_journal.sh
Вместо ALL вы можете указать конкретного пользователя Linux.
У меня была такая же проблема (не могу использовать journalctl --user
), после многих проб и ошибок я выяснил, что для правильной работы пользователь не должен быть “системным” пользователем.
- Когда у пользователя был UID 998: журнал не появлялся в
/var/log/journal
- После воссоздания пользователя с UID 1002: журнал появился после перезагрузки.
Моя конфигурация:
- Файлы юнитов находятся в:
~/.config/systemd/user/
- У меня есть ‘export XDG_RUNTIME_DIR=”/run/user/nnnn”‘ в .bashrc
- Принудительное Storage=persistent в
/etc/systemd/journald.conf
- У пользователя нет никаких специальных групп (adm или systemd-journal)
Юниты запускаются во время загрузки; с помощью следующего:
[Install]
WantedBy=default.target
С этой конфигурацией я просто выполняю “journalctl –user”, и это работает.
(Работаю на Ubuntu 16.04.7 LTS)
Надеюсь, это поможет кому-то.
Ответ или решение
Чтобы разрешить пользователю использовать команду journalctl
для просмотра логов системных служб, работающих на уровне пользователя в Ubuntu 16.04 LTS, выполните следующие шаги:
-
Проверьте правильность конфигурации
journald
: Убедитесь, что в файле конфигурации/etc/systemd/journald.conf
директиваStorage
установлена в значениеpersistent
. Это гарантирует, что журналы будут сохраняться между перезагрузками. Для этого:sudo nano /etc/systemd/journald.conf
Найдите или добавьте строку:
[Journal] Storage=persistent
После внесения изменений, сохраните файл и выйдите из редактора. Не забудьте перезагрузить службу journald:
sudo systemctl restart systemd-journald
-
Добавьте пользователя в группу
systemd-journal
: Это даст вашему пользователю необходимые разрешения для доступа к записям журнала. Выполните следующую команду, заменив$USER
на имя вашего пользователя:sudo usermod -a -G systemd-journal $USER
После этого вам нужно будет выйти из системы и снова зайти, чтобы изменения вступили в силу.
-
Запустите вашу службу: Если у вас есть служба, например,
test.service
, находящаяся в~/.config/systemd/user/
, вы можете запустить её следующей командой:systemctl --user start test.service
-
Просмотр логов службы: Теперь вы можете просматривать журналы, связанные с вашим пользовательским сервисом, с помощью команды:
journalctl --user -u test.service
Если у вас старая версия systemd, возможно, вам нужно использовать:
journalctl --user --user-unit=test.service
-
Проверка доступа к журналу: Если вы все еще получаете сообщение об ошибке, убедитесь, что пользователь, которому вы хотите дать доступ, не является системным пользователем с UID < 1000 (например, можно использовать UID выше 1000).
-
Дополнительные методы: Если указанные методы не работают, вы можете создать скрипт, который будет запускать
journalctl
с определенными параметрами с использованиемsudo
, не требуя пароля. Добавьте запись в файл/etc/sudoers
:ALL ALL=(ALL) NOPASSWD: /etc/show_journal.sh
Это позволит пользователю запускать ваш скрипт без ввода пароля, или используйте проверенные команды для просмотра журнала.
Эти шаги должны помочь вам настроить доступ к журналам пользовательских служб с использованием journalctl
. Если возникнут дальнейшие проблемы, проверьте права доступа к директории ~/.config/systemd/user/
и убедитесь, что службы запускаются корректно.