X11

無法執行依賴 X 作為 systemd 服務的應用程序

  • April 24, 2017

我正在使用帶有 i3wm 的 Manjaro 17(如果有的話)。

我想在啟動時執行一個命令來修復我的觸摸板點擊設置。我編寫了啟用該選項/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

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

GUI 是作業系統的一個獨特部分,一台機器可以有多個 GUI 環境。您對 systemd 的嘗試不起作用,因為服務是在 GUI 上下文之外執行的。事實上,它們是在 GUI 啟動之前執行的。要執行xinput,您需要有一個由X 伺服器提供的 GUI 。

DISPLAY應用程序通過環境變數知道 GUI 上下文是什麼(即與哪個 X 伺服器通信) 。這是一種檢查 GUI 是否可用的方法:如果未設置該變數,則說明您在 GUI 上下文之外。(設置變數不會創建 GUI 上下文。它可以讓您從外部連接到現有的 GUI 上下文,但這與這裡無關。)

如果您的登錄提示處於圖形模式,那麼您正在使用顯示管理器。您可以將顯示管理器配置為執行xinput,然後在顯示登錄提示時立即應用設置。如何做到這一點取決於您使用的顯示管理器;請參閱如何執行在登錄螢幕之前啟動的腳本?更多細節。

無論您如何登錄,都可以將設置應用為登錄腳本的一部分。如果您正在使用.xinitrc.xsession啟動您的 GUI 會話,請在此處添加命令。如果您正在使用具有啟動應用程序概念的桌面環境,請將xinput命令或執行它的腳本添加到您的啟動應用程序中。如果您直接使用視窗管理器,請查看其文件以了解如何在啟動時執行命令(幾乎任何視窗管理器都可以執行此操作)。

由於您使用的是 i3,因此您可以在 GUI 登錄時執行命令,方法是exec您的~/.i3/config:

exec xinput set-prop 11 290 1

儘管 systemd 將顯示管理器作為服務啟動,但我不認為它提供了在生成的 GUI 上下文中執行命令的方法。但是,它可能會提供一種在您登錄時執行命令的方法;有關範例,請參見Arch Wiki

引用自:https://unix.stackexchange.com/questions/360537