systemd пользовательская служба: переменные окружения не загружаются при запуске, но загружаются при перезапуске службы

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

Я запускаю emacs как службу, используя следующий файл конфигурации systemd:

[Unit] 
Description=Редактор текстов Emacs 
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/ 
After=graphical-session.target
 
[Service] 
Type=forking 
ExecStart=/usr/local/bin/emacs --daemon 
ExecStop=/usr/local/bin/emacsclient --eval "(kill-emacs)" 
Environment=SSH_AUTH_SOCK=%t/keyring/ssh 
EnvironmentFile=/some-path/systemd/emacs.env
PassEnvironment=BIBINPUTS BSTINPUTS TEXINPUTS LANG SHELL PATH
Restart=on-failure 

[Install] 
WantedBy=default.target

Файл emacs.env содержит следующие определения:

BIBINPUTS=.:/xxx/Jabref/:
BSTINPUTS=.:/xxx/LaTeX/bibstyles//:
TEXINPUTS=.:/xxx/LaTeX//:
LANG=en_US.UTF-8
SHELL=/usr/local/bin/fish

Странно, но после загрузки компьютера служба запускается:

 ~> systemctl --user status emacs
● emacs.service - Редактор текстов Emacs
     Loaded: loaded (/usr/local/lib/systemd/user/emacs.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-10-08 13:19:57 CEST; 11s ago
       Docs: info:emacs
             man:emacs(1)
             https://gnu.org/software/emacs/
   Main PID: 1785 (emacs)
      Tasks: 3 (limit: 37288)
     Memory: 263.0M
        CPU: 1.404s
     CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/emacs.service
             ├─1785 /usr/local/bin/emacs --fg-daemon
             └─2441 /usr/bin/aspell -a -m -B --encoding=utf-8

Oct 08 13:19:57 xxx emacs[1785]: Запуск демона Emacs.
Oct 08 13:19:57 xxx systemd[1776]: Запущен редактор текстов Emacs.

Но когда я запускаю emacs с помощью emacsclient -no-wait --create-frame и проверяю окружение с помощью M-x getenv, переменные окружения в emacs.env не установлены.

После того как я перезапускаю службу emacs с помощью

~> systemctl --user restart emacs
~> systemctl --user status emacs
● emacs.service - Редактор текстов Emacs
     Loaded: loaded (/usr/local/lib/systemd/user/emacs.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-10-08 13:25:08 CEST; 4s ago
       Docs: info:emacs
             man:emacs(1)
             https://gnu.org/software/emacs/
   Main PID: 36413 (emacs)
      Tasks: 3 (limit: 37288)
     Memory: 83.3M
        CPU: 1.147s
     CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/emacs.service
             ├─36413 /usr/local/bin/emacs --fg-daemon
             └─36727 /usr/bin/aspell -a -m -B --encoding=utf-8

и затем запускаю клиент emacs так же, как и раньше

~> emacsclient -no-wait --create-frame

переменные окружения экспортируются, как и должно быть.

Почему эти переменные окружения не загружаются при запуске? Я также проверил syslog, но не нашел никаких сообщений об ошибке или подсказок.

Ответ или решение

Ваш вопрос касательно пользовательской службы systemd и загрузки переменных окружения в службе Emacs требует внимательного рассмотрения. Давайте разберем несколько причин, почему переменные окружения загружаются при перезапуске, но не при первой загрузке служебной службы.

Возможные причины проблемы

  1. Отсутствие доступа к файлу переменных окружения:
    Убедитесь, что файл emacs.env, который вы указываете через EnvironmentFile, находится в доступном для службы пути и доступен для чтения. Некоторые службы могут работать под ограниченными учетными данными, которые могут не иметь доступа к определенным директориям.

  2. Временная задержка в загрузке переменных:
    При загрузке системы переменные окружения могут не успевать применяться до инициализации службы. Попробуйте добавить дополнительную задержку до запуска службы с помощью ExecStartPre, например:

    ExecStartPre=/bin/sleep 1

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

  3. Проблема с зависимостями запуска:
    Убедитесь, что у вас правильно указана зависимость в секции [Unit]. Возможно, After=graphical-session.target недостаточно, чтобы гарантировать, что все необходимые компоненты окружения уже загружены. Попробуйте использовать After=default.target или другие зависимости, которые могут быть более подходящими для вашей конфигурации.

  4. Кеширование окружения:
    Иногда системные демонные службы, такие как systemd, могут кэшировать состояние окружения. В случае изменения переменных окружения после первого старта службы вам может потребоваться перезагрузить саму сессию пользователя, чтобы удостовериться, что все изменения применены.

  5. Логи и отладка:
    Проверьте логи с помощью journalctl --user -xe для получения дополнительных подсказок о том, что происходит при первой загрузке службы. Это может предоставить вам больше информации о том, что именно произошло во время инициализации.

Рекомендуемое решение

Чтобы устранить вашу проблему, попробуйте:

  1. Убедитесь, что emacs.env доступен и имеет правильные разрешения.
  2. Добавьте временную задержку перед ExecStart.
  3. Проверьте и скорректируйте зависимости в [Unit].
  4. Перезагрузите систему и проверьте логи.

Попробуйте вышеуказанные рекомендации, чтобы решить проблему с загрузкой переменных окружения при первой инициализации вашей службы Emacs. Если после всех этих шагов проблема сохраняется, возможно, стоит рассмотреть альтернативные методы инициализации или использовать другие подходы для конфигурации окружения Emacs.

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

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