Вопрос или проблема
У меня есть сервис, созданный с помощью quadlet /var/minecraft/.local/containers/systemd/minecraft.container
, который включен и запускается, когда моя система загружается, всякий раз, когда я включаю компьютер. Он работает под учетной записью minecraft-server
, домашняя директория которой установлена в /var/minecraft
.
Эта учетная запись является системной. У меня уже были большие трудности с тем, чтобы выяснить, как ее запустить/остановить.
# Я ожидал, что смогу сделать следующее:
sudo -u minecraft-server systemctl --user status minecraft.service # Не сработает
# Однако мне действительно нужно использовать опцию -M:
sudo systemctl -M minecraft-server@ --user status minecraft.service # Сработает
Я могу просмотреть логи этого сервиса, сделав следующее:
# Мне нужно вручную отфильтровать по `_SYSTEMD_USER_UNIT` и `_UID`
sudo journalctl _SYSTEMD_USER_UNIT=minecraft.service _UID=$(id -u minecraft-server)
# В качестве альтернативы просто фильтрация по `_SYSTEMD_USER_UNIT` также сработает.
sudo journalctl _SYSTEMD_USER_UNIT=minecraft.service
# Это не сработает, к моему удивлению:
sudo -u minecraft-server journalctl --user
sudo -u minecraft-server journalctl --user --unit minecraft
sudo -u minecraft-server journalctl --user-unit minecraft
sudo -u minecraft-server journalctl --user --user-unit minecraft
# Все они выдают эту ошибку:
#
# Подсказка: Вы в настоящее время не видите сообщения от других пользователей и системы.
# Пользователи в группах 'adm', 'systemd-journal' могут видеть все сообщения.
# Передайте -q, чтобы отключить это уведомление.
# Никакие журнальные файлы не были открыты из-за недостаточных прав.
Я включил задержку для своей учетной записи minecraft-server, и мой journald настроен с Storage=persistent
, что является распространенными решениями, которые я нашел, когда искал эту проблему.
Теперь у меня есть способ просмотреть свои журнальные логи, но я боюсь, что он невероятно неэффективен. Честно говоря, это кажется немного кривым. Как мне правильно получить доступ к журналам journald для другого пользователя, а не для своего?
Ответ или решение
Для корректного доступа к журналам systemd для службы, запущенной под системной учетной записью, вам потребуется использовать подход, который соответствует ограничениям, накладываемым на учетные записи пользователей и их окружение. Вы уже нашли некоторые методы доступа к журналам для учетной записи minecraft-server
, но я подскажу более оптимальные и правильные способы.
-
Используйте
systemd
с флагом-M
: Как вы уже указали, правильный способ для проверки состояния службы — это выполнение команды с флагом-M
, что позволяет указать конкретную сессию пользователя, в которой запущена служба. Вы можете делать это следующим образом:sudo systemctl -M minecraft-server@ --user status minecraft.service
-
Доступ к журналам через
journalctl
: Ваш метод фильтрации записей журнала через_SYSTEMD_USER_UNIT
и_UID
действительно работает, однако для упрощения вы можете использовать команду, которая сразу обеспечивает доступ к нужным вам записям:sudo journalctl _SYSTEMD_USER_UNIT=minecraft.service
Этот подход уже хорош для получения логов, однако он предполагает использование
sudo
, так как у пользователяminecraft-server
могут быть недостаточные права доступа. -
Настройка разрешений для
systemd-journal
: Если вы хотите избежать постоянного использованияsudo
, в первую очередь убедитесь, что учетная записьminecraft-server
принадлежит к группеsystemd-journal
. Это можно сделать следующей командой:sudo usermod -aG systemd-journal minecraft-server
После этого вы получите доступ к журналам без необходимости использовать
sudo
, но вам нужно будет выйти и снова войти под этой учетной записью или перезапустить сессию. -
Включение возможности ‘linger’ : Вы уже упомянули, что включили linger для
minecraft-server
. Это хорошо, это позволяет службе работать в фоновом режиме даже после выхода из системы. Вы можете убедиться, что linger включен, следующим образом:loginctl enable-linger minecraft-server
-
Настройки журнала: Проверьте файл конфигурации
journald
. Убедитесь, что опцияStorage=persistent
включена и аналогичные параметры правильно настроены для хранения журналов. Это позволит вам не потерять логи после перезагрузки системы. -
Использование системного управления: Если вам нужно часто взаимодействовать с учетной записью через
systemctl
, можно создать собственный скрипт или alias, который будет выполнять необходимые команды более удобно.
Таким образом, подводя итог, правильный и удобный способ доступа к журналам другой пользовательской службы в вашем случае заключается в использовании sudo
с соответствующими параметрами systemctl
и journalctl
, а также в правильной настройке групп и linger. Ваш текущий метод, хоть и рабочий, можно улучшить благодаря добавлению вашей учетной записи в группу systemd-journal
, что упростит доступ к журналам.