我想在 Ubuntu 18.04 电子应用程序上输入韩语。
当使用 在终端上启动电子应用程序时yarn start
,韩语输入可以通过 顺利进行ibus
。
但是,当通过 systemctl 启动时,韩语输入不起作用。
systemctl 服务的输入法有环境设置吗?
systemctl 服务如下。
[Unit]
After=multi-user.target
[Service]
User=my
Type=idle
WorkingDirectory=/home/my/electonapp
ExecStart=/usr/bin/yarn start
Restart=always
Environment=DISPLAY=:0.0
RestartSec=30
[Install]
WantedBy=multi-user.target
答案1
是的,你缺少了很多环境变量。这是预期的结果,因为“全局”(系统范围)systemd .service 单元旨在启动后台服务并且明确不适用于 X11 应用程序(或任何需要“位于”特定用户会话内部的应用程序)。
例如,许多图形应用程序现在都需要 XDG_RUNTIME_DIR,因为它包含各种会话守护进程的 IPC 套接字。
IBus 可能需要 D-Bus,它可能在“用户会话”环境中被 XDG_RUNTIME_DIR 覆盖,但在“传统”会话中也可能需要 DBUS_SESSION_BUS_ADDRESS。
并且程序本身可能需要通过 GTK_IM_MODULE 或 XMODIFIERS 告知使用 IBus。
对于在用户登录时启动程序,首先考虑简单是否~/.config/autostart/
可以完成工作。如果你特别需要 systemd 功能,请检查是否systemd --用户由您的发行版使用(除了 CentOS 以外,它几乎存在于所有发行版中)。
如果你有systemd --用户正在运行,您可以使用它来启动和管理您的应用程序:
如果你的发行版有dbus-用户会话软件包,安装它。重启后,您的 $DBUS_SESSION_BUS_ADDRESS 应该更改为“unix:path=/run/user/…/bus”。
将您的 .service 转换为“用户”单元
~/.config/systemd/user/myapp.service
:[服务] 类型=简单 工作目录=/home/my/electonapp ExecStart=/usr/bin/yarn 启动 重启=总是 重启安全=30
没有 User=,因为您的所有单位都在您自己的帐户下运行。
请注意,此示例没有
[Install]
部分,因为即使systemd --用户目前还没有合适的 .target。(它有 default.target,但实际上运行的是期间登录后,X11 才可用。)因此它需要以不同的方式自动启动。更改 X11 启动脚本以运行以下命令:
systemctl --user import-environment systemctl --user start myapp.service
请注意,许多发行版已经调用导入环境自动,所以通常你只需要开始命令。
例如,你可以创建一个
~/.config/autostart/systemd-myapp.desktop
:[桌面条目] 类型=应用程序 Exec=systemctl --user 启动 myapp