Cette solution répond exactement à la demande de l'auteur de la question :
il doit attendre que Xorg soit opérationnel
Bien qu'il puisse y avoir de meilleures façons de procéder, comme l'ont déjà fait d'autres utilisateurs, il s'agit d'une autre approche de ce problème.
Elle est similaire à la fonction systemd-networkd-wait-online.service qui se bloque jusqu'à ce que certains critères soient remplis. Les autres services qui en dépendent seront lancés dès que ce service aura démarré avec succès ou se sera arrêté.
Selon la manuel (section "Fichiers"), le serveur X crée 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
:
#!/bin/bash
while [ 1 ]
do
# Check whether or not socket exists
if [ -S /tmp/.X11-unix/X0 ]
then
exit 0
fi
# Adjust timeout according to your needs
if [ $SECONDS -gt 15 ]
then
exit 1
fi
sleep 0.5
done
x_server_started.service
:
[Unit]
Description=Monitor X server start
[Service]
Type=oneshot
ExecStart=/path/to/confirm_x_started.sh
[Install]
WantedBy=example.target
Maintenant, activez x_server_started.service
pour démarrer en même temps que le serveur X.
Faire dépendre les autres services (qui ont besoin du serveur X pour être démarrés) de x_server_started.service
unité dépendante :
[Unit]
Description=Service that needs to have the X server started
Requires=x_server_started.service
After=x_server_started.service
[Service]
ExecStart=/path/to/binary
[Install]
WantedBy=example.target
Si le serveur X démarre sans problème, le message x_server_started.service
démarrera presque immédiatement et systemd procédera au démarrage de toutes les unités qui dépendent de x_server_started.service
.