无法运行依赖于 X 作为 systemd 服务的应用程序

无法运行依赖于 X 作为 systemd 服务的应用程序

我正在使用 Manjaro 17 和 i3wm(如果有相关的话)。

我想在启动时运行一个命令来修复我的触摸板点击设置。我编写了启用该选项/usr/bin/并将其模式更改为可执行的脚本。

/usr/bin/touchpad-enable-tap-click:

#!/bin/bash
exec xinput set-prop 11 290 1

该脚本可以在终端中顺利执行,不会造成任何问题。

根据我的研究,我准备了一个简单的服务文件/etc/systemd/system/

/etc/systemd/system/touchpad-enable-tap-click.service:

[Unit]
Description=Allow touchpad tap click

[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-enable-tap-click

[Install]
WantedBy=multi-user.target

比在重新启动之前执行以下命令:

[sercan@compaq ~]$ sudo systemctl enable touchpad-enable-tap-click.service
Created symlink /etc/systemd/system/multi-user.target.wants/touchpad-enable-tap-click.service → /etc/systemd/system/touchpad-enable-tap-click.service.

我也尝试过完整路径。

该服务无法正常工作,结果是:

系统控制状态

[sercan@compaq ~]$ systemctl status touchpad-enable-tap-click.service
● touchpad-enable-tap-click.service - Allow touchpad tap click
   Loaded: loaded (/etc/systemd/system/touchpad-enable-tap-click.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2017-04-22 01:51:17 +03; 14min ago
 Main PID: 32429 (code=exited, status=1/FAILURE)

Nis 22 01:51:17 compaq systemd[1]: Starting Allow touchpad tap click...
Nis 22 01:51:17 compaq bash[32429]: Unable to connect to X server
Nis 22 01:51:17 compaq systemd[1]: touchpad-enable-tap-click.service: Main process exited, code=exited, status=1/FAILURE
Nis 22 01:51:17 compaq systemd[1]: Failed to start Allow touchpad tap click.
Nis 22 01:51:17 compaq systemd[1]: touchpad-enable-tap-click.service: Unit entered failed state.
Nis 22 01:51:17 compaq systemd[1]: touchpad-enable-tap-click.service: Failed with result 'exit-code'.

日志-xe尝试重新启动服务后:

Nis 22 02:09:52 compaq sudo[21550]:   sercan : TTY=pts/0 ; PWD=/home/sercan ; USER=root ; COMMAND=/usr/bin/systemctl restart touchpad-enable-tap-click.service
Nis 22 02:09:52 compaq sudo[21550]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nis 22 02:09:52 compaq systemd[1]: Starting Allow touchpad tap click...
-- Subject: Unit touchpad-enable-tap-click.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit touchpad-enable-tap-click.service has begun starting up.
Nis 22 02:09:52 compaq bash[21553]: Unable to connect to X server
Nis 22 02:09:52 compaq systemd[1]: touchpad-enable-tap-click.service: Main process exited, code=exited, status=1/FAILURE
Nis 22 02:09:52 compaq systemd[1]: Failed to start Allow touchpad tap click.
-- Subject: Unit touchpad-enable-tap-click.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit touchpad-enable-tap-click.service has failed.
-- 
-- The result is failed.
Nis 22 02:09:52 compaq systemd[1]: touchpad-enable-tap-click.service: Unit entered failed state.
Nis 22 02:09:52 compaq systemd[1]: touchpad-enable-tap-click.service: Failed with result 'exit-code'.
Nis 22 02:09:52 compaq sudo[21550]: pam_unix(sudo:session): session closed for user root

我希望你能帮助我,我很感激。

答案1

GUI 是操作系统的一个独特部分,一台机器可以有多个 GUI 环境。您对 systemd 的尝试不起作用,因为服务是在 GUI 上下文之外执行的。事实上,它们是在 GUI 启动之前执行的。要运行xinput,您需要有一个 GUI,它由X服务器

应用程序通过环境变量知道GUI上下文是什么(即与哪个X服务器通信)DISPLAY。这是一种检查 GUI 是否可用的方法:如果未设置该变量,则您位于 GUI 上下文之外。 (设置变量不会创建 GUI 上下文。它可以让您从外部连接到现有的 GUI 上下文,但这与这里无关。)

如果您的登录提示是图形模式,那么您正在使用显示管理器。您可以将显示管理器配置为运行xinput,然后在显示登录提示时立即应用设置。如何执行此操作取决于您使用的显示管理器;看如何运行在登录屏幕之前启动的脚本?更多细节。

无论您如何登录,您都可以将这些设置作为登录脚本的一部分应用。如果您正在使用.xinitrc.xsession来启动 GUI 会话,请在此处添加命令。如果您使用的桌面环境具有启动应用程序的概念,请将命令xinput或运行它的脚本添加到启动应用程序中。如果您直接使用窗口管理器,请检查其文档以了解如何在启动时运行命令(几乎所有窗口管理器都可以执行此操作)。

由于您使用的是 i3,因此您可以在 GUI 登录时运行命令,方法是输入exec命令在你的~/.i3/config

exec xinput set-prop 11 290 1

尽管 systemd 将显示管理器作为服务启动,但我认为它没有提供在生成的 GUI 上下文中运行命令的方法。但是,它可能提供一种在您登录时运行命令的方法;看到拱门维基举些例子。

答案2

发生这种情况是因为您尝试在 X 加载之前运行修改 X 系统(GUI)行为的命令。因此,可以理解的是,它抱怨无法连接到 X 服务器。提示是您正在运行的命令的名称:X输入 。

现在,我不能保证 systemd 在不久的将来不会开发与尚未启动的服务器交互的功能,但就目前而言,这不是完成这项工作的正确工具。

首先要尝试的是将(没有不必要的exec)命令添加到您的~/.profile(或者,如果您使用bash并且它存在,添加到您的~/.bash_profile):

xinput set-prop 11 290 1

但请注意,如果您以非图形方式登录,这会让它抱怨。如果这不起作用(请参阅这里有关详细信息),找到一种方法将其添加到桌面环境的启动程序中。大多数流行的桌面环境(例如 Gnome、Cinnamon、KDE、Unity 等)都有 GUI 工具,可让您在登录时加载程序。看这里了解如何在 openbox 中执行此操作以及这里对于 LXDE。或者,请参阅这里使用更全局的解决方案~/config/autostart

相关内容