systemd – ¿Causa que se ejecute un script después de que se haya iniciado la red?

Pregunta:

Soy relativamente nuevo en systemd y estoy aprendiendo su arquitectura.

En este momento, estoy tratando de averiguar cómo hacer que se ejecute un script de shell personalizado. Este script debe ejecutarse después de que se haya iniciado la capa de red.

Estoy ejecutando Arch, usando systemd y netctl.

Para probar, escribí un script simple que simplemente ejecuta ip addr list > /tmp/ip.txt . Creé el siguiente archivo de servicio para este script.

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

Luego habilité el script con,

systemctl enable test

Al reiniciar, el script sí se ejecuta, pero se ejecuta antes de que se inicie la red. En otras palabras, la salida en ip.txt no muestra ninguna dirección IPv4 asignada a la interfaz principal. En el momento en que inicie sesión, la dirección IPv4 ya se ha asignado y la red está activa.

Supongo que podría alterar el punto en el que se ejecuta el script jugando con el parámetro WantedBy , pero no estoy seguro de cómo hacerlo.

¿Alguien podría señalarme en la dirección correcta?

Respuesta:

En las dependencias de configuración de red de systemd

Es muy fácil afectar el pedido de unidades de systemd. Por otro lado, debe tener cuidado con lo que garantiza una unidad completa.

Configura tu servicio

En los sistemas actuales, ordenar después de network.target solo garantiza que se ha iniciado el servicio de red, no que haya alguna configuración real. Debe realizar el pedido después de network-online.target y extraerlo para lograrlo.

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

Para lograr compatibilidad con sistemas más antiguos, es posible que también deba realizar un pedido después de network.target.

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

Eso es para el archivo unitario de su servicio y para systemd.

Implementación en versiones actuales de software

Ahora debe asegurarse de que network-online.target funcione como se esperaba (o que al menos pueda usar network.target ).

La versión actual de NetworkManager ofrece el servicio NetworkManager-wait-online.service que se obtiene mediante network-online.target y, por lo tanto, su servicio. Este servicio especial asegura que su servicio esperará hasta que todas las conexiones configuradas para iniciarse automáticamente tengan éxito, fallen o se agote el tiempo de espera.

La versión actual de systemd-networkd bloquea su servicio hasta que todos los dispositivos estén configurados según lo solicitado. Es más fácil porque actualmente solo admite configuraciones que se aplican en el momento del arranque (más específicamente, el tiempo de inicio de `systemd-networkd.service).

En aras de la integridad, el servicio /etc/init.d/network en Fedora, según lo interpretan las versiones actuales de systemd, bloquea network.target y, por lo tanto, bloquea indirectamente network-online.target y su servicio. Es un ejemplo de implementación basada en script.

Si su implementación, ya sea basada en daemon o script, se comporta como uno de los servicios de administración de red anteriores, retrasará el inicio de su servicio hasta que la configuración de la red se complete con éxito, falle por una buena razón o se agote el tiempo de espera después de un tiempo razonable marco para completar.

Es posible que desee verificar si netctl funciona de la misma manera y esa información sería una valiosa adición a esta respuesta.

Implementaciones en versiones anteriores de software

No creo que vea una versión suficientemente antigua de systemd donde esto no funcionaría bien. Pero puede comprobar que existe al menos network-online.target y que se ordena después de network.target .

Anteriormente, NetworkManager solo garantizaba que se aplicaría al menos una conexión. E incluso para que eso funcione, tendría que habilitar el servicio NetworkManager-wait-online.service explícitamente. Esto se ha solucionado durante mucho tiempo en Fedora, pero solo se aplicó recientemente en sentido ascendente.

systemctl enable NetworkManager-wait-online.service

Notas sobre las implementaciones network.target y network-online.target

Nunca debería necesitar hacer que su software dependa de NetworkManager.service o NetworkManager-wait-online.service ni de ningún otro servicio específico. En cambio, todos los servicios de administración de red deben ordenarse ellos mismos antes de network.target y, opcionalmente, network-online.target .

Un servicio de administración de red basado en un script simple debe finalizar la configuración de la red antes de salir y debe ordenarse antes de network.target y, por lo tanto, indirectamente antes de network-online.target .

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Un servicio de administración de red basado en demonios también debe ordenarse antes que network.target , aunque no sea muy útil.

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

Un servicio que espera a que finalice el demonio debe ordenarse después del servicio específico y antes de network-online.target . Debe usar Requisite en el servicio daemon para que falle inmediatamente si no se usa el servicio de administración de red respectivo.

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

El paquete debe instalar un enlace simbólico al servicio en espera en el directorio de wants para network-online.target para que sea atraído por los servicios que desean esperar la red configurada.

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

Documentación relacionada

Notas finales

Espero no solo haber ayudado a responder su pregunta en el momento en que la hizo, sino que también contribuido a mejorar la situación en las distribuciones upstream y Linux, de modo que ahora pueda dar una mejor respuesta de la que era posible al momento de escribir la original. .

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım