Systemd: ¿cómo hacer que un servicio systemd se inicie después de que la red esté completamente conectada?

12

Antecedentes

Estoy escribiendo un script simple para ejecutar en Raspbain en Raspberry Pi 2, simplemente encienda un LED para indicar que estoy listo para conectarme con SSH desde mi computadora de escritorio.

El script no es importante aquí, solo para mencionar que, como uso el control de frecuencia, el script ejecuta un bucle infinito para encender y apagar el LED con frecuencia. Entonces este es un ejemplo de servicio simple. Sin embargo, al menos la respuesta aceptada de esta pregunta me aconseja configurar el tipo en inactivo. Entonces mi archivo de servicio se ve así

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

Efecto

El servicio se ejecuta como se esperaba. Sin embargo, noté que cuando inicio masilla en mi computadora de escritorio justo después de que el LED se enciende, el mensaje de inicio de sesión no aparece inmediatamente. Así que verifiqué con

$ systemd-analyze plot > output.svg

El resultado muestra

ingrese la descripción de la imagen aquí

Pregunta

Parece que mis servicios comienzan no después network-online.target, ¿qué está mal aquí y cómo puedo solucionarlo?

Motor de tierra
fuente

Respuestas:

12

Cuando hay una pregunta sobre una directiva systemd, puede usarla man systemd.directivespara encontrar dónde está documentada. En este caso muestra que After=está documentado en man systemd.unit.

En ese archivo, muestra que la After=directiva figura en las "OPCIONES DE SECCIÓN [UNIDAD]", lo que indica que pertenece a la [Unit]sección del archivo.

La misma documentación también documenta las opciones de la sección [INSTALAR], y After=no está listada allí.

En resumen, su After=directiva estaba en la ubicación incorrecta del archivo de la unidad, por lo que no tuvo efecto hasta que la movió a la ubicación correcta.

Mark Stosberg
fuente
Para ser claros, en este caso "[Unidad]" es "[Servicio]", ya que es un archivo de servicio.
faho
¡Una respuesta pegable con las correcciones hubiera sido mucho mejor!
GerardJP
@GerardJP Es mejor enseñarle a un hombre a pescar que alimentarlo por un día. Una vez que las personas saben cómo usar la documentación de systemd, pueden encontrar respuestas autorizadas sin pasar tiempo en StackExchange mirando documentos de terceros.
Mark Stosberg
11

Lo arregla modificando el servicio como

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

Todavía no entendía completamente lo que estaba haciendo, pero funciona ahora. ¿Alguien puede explicar?

Actualizar

Esta respuesta fue creada por mí antes de que llegue la respuesta aceptada.

Motor de tierra
fuente
Que la After=directiva debe estar en la [Unit]sección. Es solo que.
Bigon