Anwendung, die von X als systemd-Dienst abhängt, kann nicht ausgeführt werden

Anwendung, die von X als systemd-Dienst abhängt, kann nicht ausgeführt werden

Ich verwende Manjaro 17 mit i3wm (falls relevant).

Ich möchte beim Start einen einzelnen Befehl ausführen, um die Tipp-Klick-Einstellung meines Touchpads zu korrigieren. Ich habe das Skript geschrieben, das die Option aktiviert /usr/bin/und ihren Modus als ausführbare Datei ändert.

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

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

Das Skript kann problemlos im Terminal ausgeführt werden, ohne Probleme zu verursachen.

Basierend auf meiner Recherche habe ich eine einfache Servicedatei im Format /etc/systemd/system/. vorbereitet.

/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

dann vor dem Neustart folgenden Befehl ausführen:

[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.

Ich habe auch den vollständigen Pfad versucht.

Der Dienst funktioniert nicht. Als Folge davon:

Systemctl-Status

[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'.

Journal -xenach dem Versuch, den Dienst neu zu starten:

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

Ich hoffe, Sie können mir helfen, das wäre mir dankbar.

Antwort1

Die GUI ist ein eigenständiger Teil des Betriebssystems, und eine Maschine kann mehrere GUI-Umgebungen haben. Ihre Versuche mit systemd funktionieren nicht, da die Dienste außerhalb eines GUI-Kontexts ausgeführt werden. Tatsächlich werden sie ausgeführt, bevor die GUI startet. Um auszuführen xinput, benötigen Sie eine GUI, die von einemX-Server.

Anwendungen wissen durch die Umgebungsvariable, was der GUI-Kontext ist (d. h. mit welchem ​​X-Server kommuniziert werden soll) DISPLAY. Auf diese Weise lässt sich prüfen, ob eine GUI verfügbar ist: Wenn diese Variable nicht gesetzt ist, befinden Sie sich außerhalb eines GUI-Kontexts. (Durch das Setzen der Variable wird kein GUI-Kontext erstellt. Sie könnten damit von außen eine Verbindung zu einem vorhandenen GUI-Kontext herstellen, aber das ist hier nicht relevant.)

Wenn Ihre Anmeldeaufforderung im grafischen Modus ist, verwenden Sie eineBildschirm Manager. Sie können den Display-Manager so konfigurieren xinput, dass er ausgeführt wird. Die Einstellungen werden dann angewendet, sobald die Anmeldeaufforderung angezeigt wird. Wie Sie das tun, hängt davon ab, welchen Display-Manager Sie verwenden. Weitere Informationen finden Sie unterWie kann ich ein Skript ausführen, das vor meinem Anmeldebildschirm startet?für mehr Details.

Unabhängig davon, wie Sie sich anmelden, können Sie die Einstellungen als Teil Ihrer Anmeldeskripte anwenden. Wenn Sie .xinitrcoder verwenden .xsession, um Ihre GUI-Sitzung zu starten, fügen Sie den Befehl dort hinzu. Wenn Sie eine Desktop-Umgebung verwenden, die ein Konzept für Startanwendungen hat, fügen Sie den xinputBefehl oder ein Skript, das ihn ausführt, zu Ihren Startanwendungen hinzu. Wenn Sie direkt einen Fenstermanager verwenden, lesen Sie in dessen Dokumentation nach, wie Sie einen Befehl beim Start ausführen (fast jeder Fenstermanager kann dies).

Da Sie i3 verwenden, können Sie einen Befehl beim GUI-Login ausführen, indem SieexecBefehlin deinem ~/.i3/config:

exec xinput set-prop 11 290 1

Obwohl systemd den Display-Manager als Dienst startet, glaube ich nicht, dass es eine Möglichkeit bietet, einen Befehl im resultierenden GUI-Kontext auszuführen. Es kann jedoch eine Möglichkeit bieten, einen Befehl auszuführen, wenn Sie sich anmelden; siehe dieArch Wikizum Beispiel.

Antwort2

Dies geschieht, weil Sie versuchen, einen Befehl auszuführen, der das Verhalten des X-Systems (der GUI) ändert, bevor X geladen wurde. Daher beschwert es sich verständlicherweise, dass keine Verbindung zum X-Server hergestellt werden kann. Der Hinweis ist der Name des Befehls, den Sie ausführen:XEingang .

Nun kann ich nicht garantieren, dass systemd in naher Zukunft nicht die Fähigkeit entwickeln wird, mit einem Server zu interagieren, der noch nicht gestartet ist, aber vorerst ist dies nicht das richtige Werkzeug für diese Aufgabe.

Versuchen Sie zunächst, diesen execBefehl (ohne das unnötige ) einfach zu Ihrem ~/.profile(oder, falls Sie verwenden bashund er vorhanden ist, zu Ihrem ~/.bash_profile) hinzuzufügen:

xinput set-prop 11 290 1

Beachten Sie jedoch, dass dies zu einer Fehlermeldung führt, wenn Sie sich nicht grafisch anmelden. Wenn das nicht funktioniert (sieheHierfür Details), finden Sie einen Weg, es zu den Startprogrammen Ihrer Desktop-Umgebung hinzuzufügen. Die meisten gängigen DEs wie Gnome, Cinnamon, KDE, Unity usw. verfügen über GUI-Tools, mit denen Sie Programme beim Anmelden laden können. SieheHierwie man es in Openbox macht undHierfür LXDE. Alternativ sieheHierfür eine globalere Lösung mit ~/config/autostart.

verwandte Informationen