Как разрешить пользователю использовать journalctl для просмотра журналов системных служб, относящихся к конкретному пользователю?

Вопрос или проблема

Я запускаю пользовательские службы в 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 самостоятельно. Там есть все логи, хотя. Я могу искать именно то приложение, которое меня интересует, и смотреть на этот вывод. Чтобы найти последнее, я сначала перехожу в конец файла, а затем ищу назад:

  1. Нажмите G, чтобы перейти в конец (это заглавное G)

  2. Нажмите ? и введите название вашего приложения

Это не так удобно, но на устройстве, с которым я работаю (платформа 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, выполните следующие шаги:

  1. Проверьте правильность конфигурации journald: Убедитесь, что в файле конфигурации /etc/systemd/journald.conf директива Storage установлена в значение persistent. Это гарантирует, что журналы будут сохраняться между перезагрузками. Для этого:

    sudo nano /etc/systemd/journald.conf

    Найдите или добавьте строку:

    [Journal]
    Storage=persistent

    После внесения изменений, сохраните файл и выйдите из редактора. Не забудьте перезагрузить службу journald:

    sudo systemctl restart systemd-journald
  2. Добавьте пользователя в группу systemd-journal: Это даст вашему пользователю необходимые разрешения для доступа к записям журнала. Выполните следующую команду, заменив $USER на имя вашего пользователя:

    sudo usermod -a -G systemd-journal $USER

    После этого вам нужно будет выйти из системы и снова зайти, чтобы изменения вступили в силу.

  3. Запустите вашу службу: Если у вас есть служба, например, test.service, находящаяся в ~/.config/systemd/user/, вы можете запустить её следующей командой:

    systemctl --user start test.service
  4. Просмотр логов службы: Теперь вы можете просматривать журналы, связанные с вашим пользовательским сервисом, с помощью команды:

    journalctl --user -u test.service

    Если у вас старая версия systemd, возможно, вам нужно использовать:

    journalctl --user --user-unit=test.service
  5. Проверка доступа к журналу: Если вы все еще получаете сообщение об ошибке, убедитесь, что пользователь, которому вы хотите дать доступ, не является системным пользователем с UID < 1000 (например, можно использовать UID выше 1000).

  6. Дополнительные методы: Если указанные методы не работают, вы можете создать скрипт, который будет запускать journalctl с определенными параметрами с использованием sudo, не требуя пароля. Добавьте запись в файл /etc/sudoers:

    ALL ALL=(ALL) NOPASSWD: /etc/show_journal.sh

    Это позволит пользователю запускать ваш скрипт без ввода пароля, или используйте проверенные команды для просмотра журнала.

Эти шаги должны помочь вам настроить доступ к журналам пользовательских служб с использованием journalctl. Если возникнут дальнейшие проблемы, проверьте права доступа к директории ~/.config/systemd/user/ и убедитесь, что службы запускаются корректно.

Оцените материал
Добавить комментарий

Капча загружается...