Ich habe dies untersucht und die Antwort von Grawity scheint veraltet zu sein. Sie können jetzt Benutzerdienste mit systemd einrichten, die als Teil der Benutzersitzung ausgeführt werden. Sie können DISPLAY und XAUTHORITY setzen (derzeit in Arch und Debian Stretch).
Dies ist gegenüber den vorherigen Empfehlungen zur Verwendung von Desktop-Autostart-Dateien sinnvoll, da Sie die Prozessverwaltung genau wie bei einer App auf Systemebene (Neustart usw.) erhalten.
Die derzeit besten Dokumente sind das Arch-Wiki. Systemd / Benutzer
TLDR-Version;
- Erstellen Sie die gewünschte * .service-Datei in
~/.config/systemd/user/
- Ausführen
systemctl --user enable [service]
(ohne .service-Suffix)
- Optional können Sie
systemctl --user start [service]
jetzt starten
- Hiermit können Sie
systemctl --user status [service]
überprüfen, wie es funktioniert
Ein paar andere nützliche Befehle.
systemctl --user list-unit-files
- Alle Benutzereinheiten anzeigen
- s
ystemctl --user daemon-reload
- Wenn Sie eine .service-Datei bearbeiten
-- Später...
Ich habe die meisten meiner Sitzungs-Daemons aktualisiert und in systemd .service-Dateien konvertiert. So kann ich ein paar zusätzliche Notizen hinzufügen.
Es gab keinen Standard-Hook zum Ausführen der Dienste bei der Anmeldung. Sie müssen ihn daher selbst auslösen. Ich mache es aus meiner ~ / .xsession-Datei.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
Die erste Zeile importiert einige Umgebungsvariablen in die systemd-Benutzersitzung und die zweite Zeile startet das Ziel. Meine xsession.target-Datei;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Mein xbindkeys.service als Beispiel.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
Der übliche Hinweis ist "nicht".
redshift
Es handelt sich nicht um einen systemweiten Dienst, da für jede Sitzung eine eigene Instanz vorhanden ist. Außerdem muss bekannt sein, wie eine Verbindung zum Xorg dieser bestimmten Sitzung hergestellt werden kann.(Xorg ist auch kein Systemdienst, sondern nur der Display-Manager. Außerdem wird für jede Sitzung ein separater Xorg gestartet. //
graphical.target
Zeigt an, wann der Display-Manager bereit ist, sagt aber nichts darüber aus, wann der DM tatsächlich den startet erste - oder alle - Anzeigen.)Es
DISPLAY=:0
reicht nicht aus, es beim Booten mit zu starten , da es keine Garantie dafür gibt, dass es zu einem bestimmten Zeitpunkt genau eine Anzeige gibt, und dass dies auch immer der:0
Fall ist (zum Beispiel, wenn Xorg abstürzt und eine veraltete Sperrdatei hinterlässt, würde die nächste so laufen,:1
wie sie ist) würde denken:0
ist noch besetzt); Sie müssen auch den Pfad zu IhrerXAUTHORITY
Datei festlegen, da X11 eine Authentifizierung erfordert. und stellen Sie sicher, dass derredshift
Computer neu gestartet wird, wenn Sie sich abmelden oder erneut anmelden.Also, wie fange ich an? In der Desktop-Umgebung gibt es fast immer verschiedene Methoden zum Starten eigener Sitzungsdienste . Sehen Sie sich einen älteren Beitrag an, der bereits die beiden üblichen beschreibt. das
~/.xprofile
Drehbuch und den~/.config/autostart/*.desktop
Ort.Wenn Sie startx verwenden , können Sie
~/.xinitrc
solche Dinge starten. Eigenständige Fenstermanager haben häufig ihre eigenen Start- / Init-Skripte. zB~/.config/openbox/autostart
für Openbox.Allen diesen Methoden ist gemeinsam, dass das Programm innerhalb der Sitzung gestartet wird, wodurch alle oben aufgeführten Probleme vermieden werden.
quelle
Folgendes habe ich gerade als Workaround für das noch nicht verfügbare
graphical-session.target
(auf meinem Kubuntu 16.04-System) erstellt:Erstellen Sie
~/.config/systemd/user/xsession.target
mit folgenden Inhalten:Erzählen Sie systemd von dieser neuen Einheit:
xsession.target
über die aktuell verfügbaren Mechaniken des Ubuntu 16.04-Desktops steuern .Erstellen Sie
~/.config/autostart-scripts/xsession.target-login.sh
mit folgenden Inhalten:Erstellen Sie
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
mit folgenden Inhalten:Machen Sie die Skripte ausführbar:
Hinweis: Diese beiden Dateien werden dort abgelegt, wo sie von KDE zum automatischen Starten und Herunterfahren abgerufen werden. Die Dateien können für andere Desktop-Umgebungen (z. B. Gnome) an einem anderen Ort abgelegt werden - aber ich kenne diese Umgebungen nicht.
Hinweis: Diese Problemumgehung unterstützt keine Multi-Desktop-Sitzungen. Es wird nur dann
graphical-session.target
richtig gehandhabt, wenn nur eine aktive X11-Sitzung auf einem Computer ausgeführt wird (dies ist jedoch bei den meisten Linux-Benutzern der Fall).graphical-session.target
und die ordnungsgemäß ausgeführt werden, während Sie auf Ihrem Desktop angemeldet sind.Als Beispiel sollte @ mkaitos Einheit so aussehen:
(Vergiss nicht,
daemon-reload
nach dem Bearbeiten deiner Einheiten eine zu machen!)Irgendwann in der Zukunft (wird es Ubuntu 17.04 sein?) Ist meine Problemumgehung veraltet, da das System das
graphical-session.target
Problem selbst richtig handhaben wird. Entfernen Sie an diesem Tag einfach das Autostart- und Shutdown-Skript und auch diexsession.target
benutzerdefinierten Benutzereinheiten.quelle
Diese Lösung macht genau das, was der Autor der Frage fragt:
Es gibt zwar bessere Möglichkeiten, dies zu tun, als dies bereits von anderen Benutzern beantwortet wurde, dies ist jedoch eine andere Herangehensweise an dieses Problem.
Es ähnelt dem systemd-networkd-wait-online.service von systemd, der blockiert, bis bestimmte Kriterien erfüllt sind. Andere Dienste, die davon abhängen, werden gestartet, sobald dieser Dienst erfolgreich gestartet wurde oder das Timeout abgelaufen ist.
Gemäß dem Handbuch (Abschnitt "Dateien") erstellt der X-Server einen UNIX-Socket
/tmp/.X11-unix/Xn
(wobein
es sich um eine Anzeigenummer handelt).Indem wir das Vorhandensein dieses Sockets überwachen, können wir feststellen, dass der Server für eine bestimmte Anzeige gestartet wurde.
confirm_x_started.sh
:x_server_started.service
:Aktivieren Sie nun, um
x_server_started.service
gleichzeitig mit dem X-Server zu starten.Stellen Sie sicher, dass andere Dienste (für die der X-Server gestartet werden muss) abhängig sind
x_server_started.service
abhängige Einheit:
Wenn der X-Server problemlos
x_server_started.service
gestartet wird , wird er fast sofort gestartet und systemd fährt mit dem Starten aller Einheiten fort, von denen abhängig istx_server_started.service
.quelle