He escrito un par de archivos de servicio de usuario systemd que quiero que los usuarios habiliten y que necesiten una conexión de red que funcione. Pensé que sería tan fácil como:
Wants=network-online.target
After=network-online.target
Sin embargo, los servicios parecen comenzar demasiado temprano, y journalctl
veo:
network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.
Luego busqué más y probé
Wants=network.target
After=network.target
y lo hizo sudo systemctl enable systemd-networkd-wait-online.service
.
Ahora tengo en journalctl
:
network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.
Y nuevamente el servicio comienza demasiado temprano.
¿Se supone que ese mensaje debe estar allí? ¿Cómo puedo depurar mi problema?
EDITAR : la razón es simple y está específicamente establecida en Arch Wiki :
systemd --user
se ejecuta como un proceso separado delsystemd --system
proceso. Las unidades de usuario no pueden hacer referencia o depender de las unidades del sistema.
Esta publicación en el foro parece sugerir una solución simple: debería link
usar la unidad del sistema necesaria como usuario, creando así un enlace simbólico disponible en la ruta de búsqueda de la unidad.
Después de hacer eso, no veo ningún No such file or directory
mensaje, sin embargo, todavía no puedo hacer que los servicios realmente se ejecuten después de que la red esté en línea. He tratado de unión network.target
, network-online.target
y systemd-networkd-wait-online.service
, fijando mis unidades a depender de cada uno de ellos, sin éxito. Cuando verifico el estado de la unidad vinculada en modo de usuario, todos están muertos, por ejemplo:
$ systemctl --user status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.
Sin embargo, puedo ver network-online.target
activo en modo de usuario después de vincularlo:
$ systemctl --user status network-online.target
● network-online.target - Network is Online
Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.
fuente
Respuestas:
Como no puede depender de un servicio del sistema, su única solución es proporcionar un servicio de usuario que detecte si la red está en línea. (O haga que sus servicios sean servicios del sistema). Los detalles para un servicio de usuario "detectar en línea" dependerán de su definición de "en línea". Podría esperar un ping a 8.8.8.8 para tener éxito, por ejemplo. O para que una resolución de nombre DNS tenga éxito. Por ejemplo, en una situación similar con vpnc, espero que un ping a una IP vpn tenga éxito.
Luego, puede hacer que sus servicios de usuario dependan de (After =) su servicio de detección en línea.
fuente
Yo recomendaría probar algo como esto:
Seguido por:
fuente