Да, вам не хватает многих переменных среды. Это ожидаемый результат, так как "глобальные" (общесистемные) системные модули .service предназначены для запуска фоновых служб и явно не предназначены для приложений X11 (или чего-либо, что требует нахождения "внутри" определенного пользовательского сеанса).
Например, XDG_RUNTIME_DIR теперь требуется во многих графических приложениях, поскольку содержит сокеты IPC различных демонов сеансов.
IBus, вероятно, требует D-Bus, который может быть покрыт XDG_RUNTIME_DIR в средах "пользовательского сеанса", но может также потребоваться DBUS_SESSION_BUS_ADDRESS в "традиционных" сеансах.
А самой программе может потребоваться использовать IBus через GTK_IM_MODULE или XMODIFIERS.
Для запуска программы при входе пользователя в систему сначала подумайте, будет ли работать простой ~/.config/autostart/
. Если вам конкретно нужна функциональность systemd, проверьте, используется ли systemd --user вашим дистрибутивом (он существует почти во всех из них, кроме CentOS).
Если у вас запущен systemd --user , вы можете использовать его для запуска и управления вашим приложением:
Если в вашем дистрибутиве есть пакет dbus-user-session , установите его. После перезагрузки ваш $ DBUS_SESSION_BUS_ADDRESS должен измениться на «unix:path =/run/user/… /bus».
Преобразуйте ваш .service в пользовательский модуль по адресу ~/.config/systemd/user/myapp.service
:
[Service] Тип = простой WorkingDirectory =/home /my /electonapp ExecStart =/usr /bin /yarn start Restart = всегда RestartSec = 30
Там нет User =, так как все ваши юниты работают под вашей собственной учетной записью.
Обратите внимание, что в этом примере нет раздела [Install]
, так как даже systemd --user пока не имеет соответствующей цели .target для этого. (У него есть default.target, но на самом деле он запускается во время входа в систему, прежде чем станет доступен X11.) Поэтому его нужно будет запускать другим способом.
Измените сценарии запуска X11, чтобы выполнить следующие команды:
systemctl --user import-environment
systemctl --user start myapp.service
Обратите внимание, что многие дистрибутивы уже вызывают import-environment автоматически, поэтому обычно все, что вам нужно, это команда start .
Например, вы можете создать ~/.config/autostart/systemd-myapp.desktop
с помощью:
[Desktop Entry] Тип = Приложение Exec = systemctl --user start myapp