J'ai fait des recherches sur cela et la réponse de grawity semble obsolète. Vous pouvez maintenant configurer les services utilisateur avec systemd qui s'exécutent avec dans le cadre de la session de l'utilisateur. Ils peuvent avoir DISPLAY et XAUTHORITY définis (actuellement dans Arch et Debian Stretch).
Cela est logique par rapport aux recommandations précédentes d'utilisation des fichiers de démarrage automatique du bureau, car vous obtenez la gestion des processus comme vous le feriez pour une application de niveau système (redémarrage, etc.).
Le meilleur documentaire en ce moment est le wiki Arch; Systemd / User
Version TLDR;
- Créez le fichier * .service souhaité dans
~/.config/systemd/user/
- Exécuter
systemctl --user enable [service]
(exclure le suffixe .service)
- Exécutez éventuellement
systemctl --user start [service]
pour commencer maintenant
- Utilisez
systemctl --user status [service]
pour vérifier comment ça se passe
Quelques autres commandes utiles.
systemctl --user list-unit-files
- afficher toutes les unités utilisateur
- s
ystemctl --user daemon-reload
- si vous modifiez un fichier .service
-- Plus tard...
J'ai mis à niveau et converti la plupart de mes démons de session en fichiers systemd .service. Je peux donc ajouter quelques notes supplémentaires.
Il n'y avait pas de hook par défaut pour exécuter les services à la connexion, vous devez donc le déclencher vous-même. Je le fais depuis mon fichier ~ / .xsession.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
La première ligne importe certaines variables d'environnement dans la session utilisateur systemd et la seconde lance la cible. Mon fichier xsession.target;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Mon xbindkeys.service comme exemple.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
John Eikenberry
la source
L'allusion habituelle est «ne pas».
redshift
n'est pas un service à l'échelle du système - il aurait une instance distincte pour chaque session , et il doit savoir comment se connecter au Xorg de cette session spécifique.(Xorg n'est pas non plus un service système - seul le gestionnaire d'affichage l' est, et il lance également un Xorg distinct pour chaque session. //
graphical.target
vous indiquera quand le gestionnaire d'affichage est prêt, mais il ne dit rien sur le moment où le DM démarre réellement le premier - ou tous - s'affiche.)Il
DISPLAY=:0
ne suffit pas de le démarrer au démarrage , car il n'y a aucune garantie qu'il y ait exactement un écran à un moment donné, ni qu'il l'est toujours:0
(par exemple, si Xorg se bloque en laissant un fichier de verrouillage périmé, le suivant fonctionnerait:1
comme il penserait:0
est encore occupé); vous devez également définir le chemin d'accès à votreXAUTHORITY
fichier car X11 nécessite une authentification; et assurez-vous d'redshift
être redémarré si jamais vous vous déconnectez et vous reconnectez.Alors comment le démarrer? Presque toujours, l'environnement de bureau dispose de plusieurs méthodes pour démarrer ses propres services de session . Voir un ancien article qui décrit déjà les deux habituels; le
~/.xprofile
script et l'~/.config/autostart/*.desktop
emplacement.Si vous utilisez startx , vous pouvez utiliser
~/.xinitrc
pour démarrer de telles choses. Les gestionnaires de fenêtres autonomes ont souvent leurs propres scripts de démarrage / init; par exemple~/.config/openbox/autostart
pour Openbox.Ce qui est commun à toutes ces méthodes, c'est que le programme est démarré à partir de la session - en évitant tous les problèmes répertoriés ci-dessus.
la source
Voici ce que je viens de créer comme solution de contournement au non encore disponible
graphical-session.target
(sur mon système Kubuntu 16.04):Créez
~/.config/systemd/user/xsession.target
avec le contenu suivant:Parlez à systemd de cette nouvelle unité:
xsession.target
via les mécanismes actuellement disponibles du bureau Ubuntu 16.04.Créez
~/.config/autostart-scripts/xsession.target-login.sh
avec le contenu suivant:Créez
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
avec le contenu suivant:Rendez les scripts exécutables:
Remarque: ces deux fichiers sont placés là où KDE les récupérera pour le démarrage automatique et l'arrêt. Les fichiers peuvent être placés ailleurs pour d'autres environnements de bureau (par exemple Gnome) - mais je ne connais pas ces environnements.
Remarque: cette solution de contournement ne prend pas en charge les sessions multi-bureaux. Il ne gère
graphical-session.target
correctement que tant qu'une seule session X11 active est exécutée sur une machine (mais c'est le cas pour la plupart d'entre nous utilisateurs Linux).graphical-session.target
et faites-les fonctionner correctement tout en étant connecté sur votre bureau.Comme exemple, l'unité de @ mkaito devrait ressembler à ceci:
(N'oubliez pas de faire un
daemon-reload
après avoir édité vos unités!)À un jour futur (sera-ce Ubuntu 17.04?), Ma solution de contournement deviendra obsolète car le système se débrouillera
graphical-session.target
correctement lui-même. À ce jour, supprimez simplement le script de démarrage automatique et d'arrêt ainsi que lexsession.target
- vos unités utilisateur personnalisées peuvent rester intactes et fonctionner.la source
Cette solution fait exactement ce que l'auteur de la question demande:
Bien qu'il puisse y avoir de meilleures façons de le faire, comme l'ont déjà répondu d'autres utilisateurs, c'est une autre approche de ce problème.
Il est similaire au service systemd -networkd-wait-online.service de systemd qui bloque jusqu'à ce que certains critères soient remplis. Les autres services qui en dépendent seront lancés dès que ce service démarre avec succès ou arrive à expiration.
Selon le manuel (section "Fichiers"), le serveur X créera un socket UNIX
/tmp/.X11-unix/Xn
(oùn
est un numéro d'affichage).En surveillant la présence de ce socket, nous pouvons déterminer que le serveur pour un affichage particulier a démarré.
confirm_x_started.sh
:x_server_started.service
:Maintenant, activez
x_server_started.service
pour démarrer en même temps avec le serveur X.Faire dépendre d'autres services (qui nécessitent le démarrage du serveur X)
x_server_started.service
unité dépendante:
Si le serveur X démarre sans problème, le
x_server_started.service
démarrera presque immédiatement et systemd commencera à démarrer toutes les unités qui en dépendentx_server_started.service
.la source