Вопрос или проблема
Я запускаю 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 требует внимательного рассмотрения. Давайте разберем несколько причин, почему переменные окружения загружаются при перезапуске, но не при первой загрузке служебной службы.
Возможные причины проблемы
-
Отсутствие доступа к файлу переменных окружения:
Убедитесь, что файлemacs.env
, который вы указываете черезEnvironmentFile
, находится в доступном для службы пути и доступен для чтения. Некоторые службы могут работать под ограниченными учетными данными, которые могут не иметь доступа к определенным директориям. -
Временная задержка в загрузке переменных:
При загрузке системы переменные окружения могут не успевать применяться до инициализации службы. Попробуйте добавить дополнительную задержку до запуска службы с помощьюExecStartPre
, например:ExecStartPre=/bin/sleep 1
Это даст системе больше времени для загрузки и применения переменных окружения.
-
Проблема с зависимостями запуска:
Убедитесь, что у вас правильно указана зависимость в секции[Unit]
. Возможно,After=graphical-session.target
недостаточно, чтобы гарантировать, что все необходимые компоненты окружения уже загружены. Попробуйте использоватьAfter=default.target
или другие зависимости, которые могут быть более подходящими для вашей конфигурации. -
Кеширование окружения:
Иногда системные демонные службы, такие какsystemd
, могут кэшировать состояние окружения. В случае изменения переменных окружения после первого старта службы вам может потребоваться перезагрузить саму сессию пользователя, чтобы удостовериться, что все изменения применены. -
Логи и отладка:
Проверьте логи с помощьюjournalctl --user -xe
для получения дополнительных подсказок о том, что происходит при первой загрузке службы. Это может предоставить вам больше информации о том, что именно произошло во время инициализации.
Рекомендуемое решение
Чтобы устранить вашу проблему, попробуйте:
- Убедитесь, что
emacs.env
доступен и имеет правильные разрешения. - Добавьте временную задержку перед
ExecStart
. - Проверьте и скорректируйте зависимости в
[Unit]
. - Перезагрузите систему и проверьте логи.
Попробуйте вышеуказанные рекомендации, чтобы решить проблему с загрузкой переменных окружения при первой инициализации вашей службы Emacs. Если после всех этих шагов проблема сохраняется, возможно, стоит рассмотреть альтернативные методы инициализации или использовать другие подходы для конфигурации окружения Emacs.