He estado investigando esto y la respuesta de Grawity parece desactualizada. Ahora puede configurar servicios de usuario con systemd que se ejecutan como parte de la sesión del usuario. Pueden tener DISPLAY y XAUTHORITY establecidos (actualmente en Arch y Debian Stretch).
Esto tiene sentido sobre las recomendaciones anteriores de usar archivos de inicio automático de escritorio, ya que obtiene la administración de procesos como lo haría con una aplicación de nivel de sistema (reinicio, etc.).
Los mejores documentos en este momento son Arch wiki; Systemd / Usuario
Versión TLDR;
- Cree el archivo * .service deseado en
~/.config/systemd/user/
- Ejecutar
systemctl --user enable [service]
(excluir sufijo .service)
- Opcionalmente, ejecute
systemctl --user start [service]
para comenzar ahora
- Úselo
systemctl --user status [service]
para ver cómo le va
Un par de otros comandos útiles.
systemctl --user list-unit-files
- ver todas las unidades de usuario
- s
ystemctl --user daemon-reload
: si edita un archivo .service
-- Luego...
Actualicé y convertí la mayoría de mis daemons de sesión en archivos systemd .service. Entonces puedo agregar un par de notas adicionales.
No había un enlace predeterminado para ejecutar los servicios al iniciar sesión, por lo que debe activarlo usted mismo. Lo hago desde mi archivo ~ / .xsession.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
La primera línea importa algunas variables de entorno en la sesión del usuario systemd y la segunda inicia el objetivo. Mi archivo xsession.target;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Mi xbindkeys.service como ejemplo.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
La pista habitual es "no".
redshift
no es un servicio de todo el sistema: tendría una instancia separada para cada sesión y necesita saber cómo conectarse al Xorg de esa sesión específica.(Xorg tampoco es un servicio del sistema, solo el administrador de pantalla lo es, y también lanza un Xorg separado para cada sesión. //
graphical.target
le indicará cuándo está listo el administrador de pantalla, pero no dice nada sobre cuándo el DM realmente inicia el primera - o todas - pantallas).Simplemente iniciarlo en el arranque
DISPLAY=:0
no es suficiente, ya que no hay garantía de que haya exactamente una pantalla en un momento dado, ni de que siempre sea así:0
(por ejemplo, si Xorg se bloquea dejando un archivo de bloqueo obsoleto, la siguiente se ejecutará:1
como pensaría que:0
todavía está ocupado); también necesita establecer la ruta a suXAUTHORITY
archivo ya que X11 requiere autenticación; y asegúrese de queredshift
se reinicie si alguna vez cierra sesión y vuelve a iniciar sesión.Entonces, ¿cómo comenzarlo? Casi siempre, el entorno de escritorio tiene varios métodos para iniciar sus propios servicios de sesión . Vea una publicación anterior que ya describe las dos habituales; El
~/.xprofile
guión y la~/.config/autostart/*.desktop
ubicación.Si usa startx , puede usar
~/.xinitrc
para comenzar tales cosas. Los administradores de ventanas independientes a menudo tienen sus propios scripts de inicio / inicio; por ejemplo~/.config/openbox/autostart
para Openbox.Lo que es común a todos estos métodos es que el programa se inicia desde dentro de la sesión - evitando todos los problemas mencionados anteriormente.
fuente
Esto es lo que acabo de crear como solución alternativa a lo que aún no está disponible
graphical-session.target
(en mi sistema Kubuntu 16.04):Crea
~/.config/systemd/user/xsession.target
con los siguientes contenidos:Dígale a systemd sobre esta nueva unidad:
xsession.target
través de la mecánica actualmente disponible del escritorio Ubuntu 16.04.Crea
~/.config/autostart-scripts/xsession.target-login.sh
con los siguientes contenidos:Crea
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
con los siguientes contenidos:Haga que los scripts sean ejecutables:
Nota: estos dos archivos se colocan donde KDE los recogerá para el inicio automático y el apagado. Los archivos pueden colocarse en otro lugar para otros entornos de escritorio (por ejemplo, Gnome), pero no sé acerca de esos entornos.
Nota: Esta solución alternativa carece de soporte para sesiones de escritorio múltiples. Solo se maneja
graphical-session.target
correctamente siempre que solo se ejecute una sesión X11 activa en una máquina (pero ese es el caso para la mayoría de los usuarios de Linux).graphical-session.target
y haga que se ejecuten de manera limpia mientras está conectado en su escritorio.Como ejemplo, la unidad de @ mkaito debería verse así:
(¡No olvides hacer un
daemon-reload
después de editar tus unidades!)En algún día futuro (¿será Ubuntu 17.04?) Mi solución se volverá obsoleta ya que el sistema se encargará
graphical-session.target
correctamente. En ese día, simplemente elimine la secuencia de comandos de inicio automático y apagado y tambiénxsession.target
: sus unidades de usuario personalizadas pueden permanecer intactas y funcionar.fuente
Esta solución hace exactamente lo que pregunta el autor de la pregunta:
Si bien podría haber mejores formas de hacerlo, como ya respondieron otros usuarios, este es otro enfoque para este problema.
Es similar al sistema systemd -networkd-wait-online.service que bloquea hasta que se cumplen ciertos criterios. Otros servicios que dependen de él se lanzarán tan pronto como este servicio se inicie correctamente o se agote el tiempo de espera.
Según el manual (sección "Archivos"), el servidor X creará un socket UNIX
/tmp/.X11-unix/Xn
(donden
hay un número de pantalla).Al monitorear la presencia de este socket, podemos determinar que el servidor para una pantalla en particular ha comenzado.
confirm_x_started.sh
:x_server_started.service
:Ahora, habilite
x_server_started.service
comenzar al mismo tiempo con el servidor X.Hacer que otros servicios (que necesitan que se inicie el servidor X) dependan de
x_server_started.service
unidad dependiente:
Si el servidor X se inicia sin problemas,
x_server_started.service
se iniciará casi de inmediato y systemd procederá a iniciar todas las unidades que dependenx_server_started.service
.fuente