Systemd: comment démarrer un service systemd après une connexion complète au réseau?

12

Contexte

J'écris un script simple à exécuter dans Raspbain sur Raspberry Pi 2, allumez simplement une LED pour indiquer que je suis prêt à me connecter avec SSH à partir de mon ordinateur de bureau.

Le script n'est pas important ici, seulement pour mentionner que lorsque j'utilise le contrôle de fréquence, le script exécute une boucle infinie, pour allumer et éteindre fréquemment la LED. C'est donc un exemple de service simple. Cependant, au moins la réponse acceptée à cette question me conseille de définir le type sur inactif. Donc mon fichier de service ressemble

[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

Effet

Le service fonctionne comme prévu. Cependant, j'ai remarqué que lorsque je démarre du mastic sur mon ordinateur de bureau juste après que le voyant s'allume, l'invite de connexion n'apparaît pas immédiatement. J'ai donc vérifié avec

$ systemd-analyze plot > output.svg

Le résultat montre

entrez la description de l'image ici

Question

Il semble que mes services ne commencent pas après network-online.target, qu'est-ce qui ne va pas ici et comment puis-je le réparer?

Earth Engine
la source

Réponses:

12

Lorsqu'il y a une question sur une directive systemd, vous pouvez utiliser man systemd.directivespour trouver où elle est documentée. Dans ce cas, cela montre que cela After=est documenté dans man systemd.unit.

Dans ce fichier, il indique que la After=directive est répertoriée dans les "OPTIONS DE SECTION [UNIT]", indiquant qu'elle appartient à la [Unit]section du fichier.

La même documentation documente également les options de la section [INSTALL] et After=n'y figure pas.

En bref, votre After=directive se trouvait au mauvais emplacement du fichier d'unité, elle n'a donc eu aucun effet tant que vous ne l'avez pas déplacée au bon emplacement.

Mark Stosberg
la source
Pour être clair, dans ce cas, "[Unit]" est "[Service]", car il s'agit d'un fichier de service.
faho
Une copie collable avec les corrections aurait été bien mieux!
GerardJP
@GerardJP Mieux vaut apprendre à un homme à pêcher que de le nourrir pendant une journée. Une fois que les gens savent comment utiliser la documentation systemd, ils peuvent trouver des réponses faisant autorité sans passer de temps sur StackExchange à regarder des documents tiers.
Mark Stosberg
11

Faites-le réparer en modifiant le service comme

[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

Je ne comprenais toujours pas complètement ce que je faisais, mais cela fonctionne maintenant. Quelqu'un peut-il expliquer?

Mise à jour

Cette réponse a été créée par moi-même avant la réponse acceptée.

Earth Engine
la source
Que la After=directive doit être dans la [Unit]section. C'est juste ça.
Bigon