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

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

Fondo

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

El script no es importante aquí, solo mencionar que como uso el control de frecuencia, el script ejecuta un bucle infinito, para encender y apagar el LED con frecuencia. Este es un ejemplo de servicio simple. Sin embargo, al menosla respuesta aceptada de esta preguntaAconséjeme que establezca 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 funciona como se esperaba. Sin embargo, noté que cuando inicio PuTTY en mi computadora de escritorio justo después de que se enciende el LED, el mensaje de inicio de sesión no aparece de inmediato. Entonces lo verifiqué con

$ systemd-analyze plot > output.svg

El resultado muestra

ingrese la descripción de la imagen aquí

Pregunta

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

Respuesta1

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

En ese archivo, muestra que la After=directiva aparece en las "OPCIONES DE SECCIÓN [UNIDAD]", indicando 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 figura allí.

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

Respuesta2

Arréglelo 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 entiendo completamente lo que estaba haciendo, pero ahora funciona. ¿Alguien puede explicarlo?

Actualizar

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

información relacionada