¿Cómo hago que ciertos servicios dependan de ciertas interfaces?

¿Cómo hago que ciertos servicios dependan de ciertas interfaces?

Con SystemD, ¿cómo puedo hacer que ciertos servicios dependan de que ciertas interfaces de red estén activas?

Por ejemplo, digamos que tengo una interfaz de enlace 802.1ad y necesito esperar para acceder a mi SAN/NAS antes de abrir libvirtd, aunque pueda tener acceso a la red disponible a través de una interfaz diferente. ¿O digamos que tengo un sshfssoporte que quiero que se active automáticamente (y se desmonte automáticamente) dependiendo de una conexión VPN?

¿Cuál es la forma idiomática de manejar dependencias detalladas en las interfaces de red?

Actualmente, estoy usando NetworkManager en Ubuntu y CentOS7, pero estoy abierto a otros mecanismos apropiados para la plataforma para administrar el estado de la red.

Respuesta1

En realidad, no creo que exista un estándar integrado, pero hay algunas cosas que puedes aprovechar systemd.

ExecStartPre=

Comandos adicionales que se ejecutan antes del [...] comando en ExecStart=, respectivamente. La sintaxis es la misma que para ExecStart=, excepto que se permiten múltiples líneas de comando y los comandos se ejecutan uno tras otro, en serie.

Si alguno de esos comandos (sin el prefijo "-") falla, el resto no se ejecuta y la unidad se considera fallida.

Reiniciar = en caso de error

Configura si el servicio se reiniciará cuando el proceso de servicio salga, finalice o se alcance un tiempo de espera.

Si se establece en caso de falla, el servicio se reiniciará cuando el proceso salga con un código de salida distinto de cero, finalice mediante una señal (incluido el volcado de núcleo, pero excluyendo las cuatro señales antes mencionadas), cuando una operación (como el servicio recarga) se agota el tiempo de espera y cuando se activa el tiempo de espera de vigilancia configurado.


Se considera que los comandos han fallado si devuelven códigos de salida distintos de cero, por lo que al configurar ExecStartPrealgo que demuestre que su interfaz está activa, puede estar seguro de que su servicio lo requerirá.

Algunos ejemplos:

ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}

ExecStartPre=/usr/sbin/iscsiadm -m session

Personalmente, me gusta la iscsiadmvariante para su caso de uso. Si hay conexiones iscsi el valor de retorno es 0, de lo contrario devuelve 21 (lo que provocaría que el servicio fallara). La pingvariante puede funcionar para una mayor variedad de usos, pero yo diría que en la mayoría de los casos es posible que desee encontrar un comando más adecuado para verificar el estado de la red. Incluso podrías intentar usarlo sshsi tienes claves configuradas para verificar cosas en otro host.

El punto es que ExecStartPrepuede permitirle hacer que su servicio falle según cualquier comando. Simplemente verifique para asegurarse de que cualquier comando que use devolverá códigos de salida distintos de cero cuando lo desee (por ejemplo, catal procesar un archivo vacío se devuelve 0, mientras que catal procesar un archivo inexistente se devuelve 1).


Después de considerarlo un poco y el comentario del autor de la pregunta, diría quemejorUna forma de definir una condición compleja para un servicio es crear otro servicio del que dependa.

Cree un nuevo servicio que utilice el comando para verificar el estado como archivo ExecStart. Dale el Restart=on-failure. Luego haga su servicio original Requirey Aftereso.

El ExecStartPreejemplo que utilicé anteriormente está distorsionando su propósito original, que era configurar las cosas para que el servicio se ejecutara correctamente. Todavía se puede aplicar y el conocimiento sigue siendo útil, así que lo dejo intacto.

información relacionada