J'essaie de créer un service systemd sur Debian Jessie. J'en ai besoin pour commencer une fois network-online.target
atteint.
Le problème est que les network-online.target
incendies se produisent en même temps network.target
et qu'à ce moment-là mes interfaces ne sont pas encore configurées, vient de lancer la requête DHCP.
Il semble que ce problème soit spécifique à Debian car il utilise la configuration réseau héritée.
Comment contourner ce problème ou comment faire network-online.target
fonctionner?
debian
systemd
systemd-networkd
10robinho
la source
la source
systemctl list-dependencies network-online.target
? Sachez également quenetwork-online.target
cela ne signifie pas nécessairement qu'il existe un accès Internet. Voir cette page pour plus d'informations.network-online.target ● └─systemd-networkd-wait-online.service
j'ai déjà lu cette page, je comprends le concept de base là-bas, mais il est toujours très étrange de ne pas avoir de point défini où les services critiques du réseau peuvent démarrer. Au moins, il pourrait attendre une affectation DHCP appropriée.network-online.target
dépend uniquement dusystemd-networkd-wait-online.service
dicton qu'il est prêt. Cela ne dépend pas du fait que NetworkManager soit prêt, ni de vérifier queifup
tous les liens ont réussi (si vous utilisez cette méthode pour configurer votre réseau). Ubuntu, en revanche, dépend deifup
et de NetworkManager, mais pas poursystemd-networkd-wait-online.
./etc/network/interfaces
:, les.network
fichiers systemd ou NetworkManager?network-online.target
et vousnetwork.target
déclenchez juste aprèsifup
. J'utilise Debian par défaut, donc/etc/network/interfaces
avec l'adresse DHCP. Il semble que networkd pourrait être une meilleure solution, mais sa mise en œuvre n'est pas simple.Réponses:
Puisque vous utilisez
/etc/network/interfaces
, vous aurez besoin d'un service systemd pour surveiller l'état de chaque interface. Vérifiez si vous en avez/lib/systemd/system/ifup-wait-all-auto.service
(installé par leifupdown
paquet dans Ubuntu 15.04). Sinon, créez/etc/systemd/system/ifup-wait-all-auto.service
et collez les éléments suivants:Il s'agit du fichier de service présent sur un système Ubuntu 15.04, mais avec la
[Install]
section ajoutée pour faciliter les choses. J'espère que le comportement deifup
Ubuntu 15.04 est le même que celui deifup
Debian Jessie. Sinon, une modification sera nécessaire (notamment avec la dernière ligne).Ensuite, courez
sudo systemctl enable ifup-wait-all-auto.service
. Après le redémarrage de votre ordinateur, vous devriez voir que lenetwork-online.target
est atteint après que les interfaces ont été lancées (au moins).la source
ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'
. Cela dépendhostname
de vérifier si l'adresse IP a été attribuée.ifup-wait-all-auto.service
a été supprimé dans laifupdown
version0.8.5ubuntu1
: ”Drop ifup-wait-all-auto.service. Cela a été mis en œuvre de manière plus élégante en faisant directementAttention! Je viens de le comprendre sur un Raspbian Jessie: supprimez TOUTES les lignes commentées dans les interfaces / etc / network et cela fonctionnera! Cela semble être un bug d'analyse =) Dans mon cas spécifique, j'ai laissé un commentaire
iface eth0 inet dhcp
et je l'ai juste oublié il y a des éons, mais après la mise à niveau vers Raspbian Jessie et la reconstruction d'un noyau, j'ai un comportement très étrange: il a utilisé DHCP et a refusé de faire un réglage à partir de / etc / network / interfaces. Je l'ai donc retiré de tout commentaire - juste des lignes de travail, redémarrez - et cela fonctionne! AUCUN PATCH / ÉDITION DE SCRIPT NÉCESSAIRE!la source
/etc/network/interfaces
fichier - il se déclenchera s'il est toujours là.Par https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ la façon recommandée de démarrer un service APRÈS la mise en réseau est de niveau est d'utiliser " network-online.target " dans le fichier .service :
Cependant, après avoir utilisé " network-online.target " et mon service a échoué parce que la mise en réseau n'était pas complètement au niveau, j'ai découvert qu'il y avait un bogue ( https://github.com/coreos/bugs/issues/1966 ) avec: non garanti être 100% infaillible.
En effet, lorsque des outils de configuration de réseau dynamique tels que " NetworkManager " sont utilisés comme dans ce cas, l'état du réseau ne peut jamais être précis ou prévisible à 100%. Apparemment, à partir du lien décrivant le bogue, " network-online.target " peut se comporter de manière incohérente selon les différentes applications avec lesquelles il est utilisé.
Solution :
vous devez analyser l'ordre de démarrage des services et en utiliser un qui démarre plus tard que " network-online.target ":
Il s'agit d'un processus itératif qui modifie progressivement les cibles en services de plus en plus récents jusqu'à ce que vous trouviez celui qui garantit que le réseau est de niveau et que votre service démarre sans erreur. Dans mon propre cas, j'ai même dû mettre
sleep 10
dans mon script le service SystemD appelé.la source
J'ai trouvé une fois une réponse sur Github qui l'a résolue en essayant continuellement de cingler un serveur. Ce n'est que lorsque le ping arrive, que le service continue:
J'ai remplacé
google.com
par mon propre serveur car mon script principal devait se connecter à mon serveur.la source