web-dev-qa-db-fra.com

Quel est le bon moyen de redémarrer les services dépendants lors de l'installation du package?

Je crée un package de configuration et souhaite arrêter et redémarrer les services dont la configuration est affectée. En ce moment, j'utilise le service [stop|restart] de {pre,post}{inst,rm}. J'ai lu quelque part dans une question que invoke-rc.d est le moyen correct , car il respecte les préférences de l'utilisateur concernant un service. Cependant, je n'ai trouvé aucune directive à ce sujet. Est-ce que quelqu'un sait de telles directives? Ou avez-vous un conseil quant à la manière dont je devrais choisir? Le paquet est à usage interne et ne sera probablement que pour 14.04 pour les deux prochaines années. Cependant, j'aimerais laisser un état aussi propre que possible à mon successeur, alors systemd est également dans mon esprit.

De la invoke-rc.d page de manuel :

Tous les accès aux scripts d'initialisation par les scripts de maintenance des paquets Debian doivent s'effectuer via invoke-rc.d .

Tiré du Manuel de la politique Debian, Chapitre 9, Section 3. :

Les responsables de la maintenance doivent utiliser la couche d'abstraction fournie par les programmes update-rc.d et invoke-rc.d pour traiter les scripts inits dans les scripts de leurs packages, tels que postinst, prerm et postrm.

...

Les scripts de maintenance de package doivent utiliser invoke-rc.d pour appeler les initscripts /etc/init.d/*, au lieu de les appeler directement.

Debian a utilisé sysv-init et passera directement à systemd, et je suppose que le manuel des politiques sera mis à jour en temps voulu pour faire référence à systemctl. Cependant, ce que je ne sais pas, c'est: devrais-je utiliser invoke-rc.d au lieu de service? Je peux dire à dpkg que certains fichiers m'intéressent (via des déclencheurs), alors existe-t-il un moyen de dire à dpkg que certains services m'intéressent et obtenir dpkg faire le redémarrage/rechargement?

Pour clarifier: I ne suis pas en train d'écrire des scripts d'initialisation. Je fournis un package avec une configuration pour d'autres applications, telles que Puppet, NTP, etc., donc j'arrête et redémarre les services correspondants dans les scripts.

Ici , par exemple, est un problème de Docker à propos de invoke-rc.d vs service. La question est toujours ouverte, avec une personne, probablement un responsable, qui a déclaré qu’elle était vraiment intéressée par le faire à droite - il est clair que nous ne sommes pas certains de ce qu’il en est. (Ma question est indépendante de cette question.)

10
muru

Je continuerais à utiliser les scripts pré/post-inst,

preinst - Ce script s'exécute avant que le paquet ne soit décompressé de son fichier d'archive Debian (".deb"). De nombreux scripts 'preinst' arrêtent les services pour les paquets en cours de mise à niveau jusqu'à la fin de leur installation ou de leur mise à niveau (après l'exécution réussie du script 'postinst') .

postinst - Ce script complète généralement toute configuration requise du paquet foo une fois que foo a été décompressé de son fichier d'archive Debian (".deb"). Souvent, les scripts 'postinst' demandent à l'utilisateur une saisie et/ou l'avertissent que, s'il accepte les valeurs par défaut, il ne doit pas oublier de revenir en arrière et de reconfigurer ce paquet selon les circonstances. De nombreux scripts 'postinst' exécutent ensuite les commandes nécessaires au démarrage ou au redémarrage d'un service une fois qu'un nouveau package a été installé ou mis à niveau.

voir - https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.fr.html

La syntaxe d'appel de start | stop | restart est écrite en tant que condition, voir https://www.debian.org/doc/debian-policy/ch-opersys.html section 9.3.3.2 Exécution d'initscripts

si invoke-rc.d>/dev/null 2> & 1; ensuite

paquet invoke-rc.d

else

/etc/init.d/package

fi

alors ...

if which service >/dev/null 2>&1; then
        service package <action>
Elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

et ajouter une autre condition pour systemd si nécessaire;)

Donc oui, la bonne façon de démarrer | arrêter | redémarrer un service est d'utiliser le script de wrapper approprié (invoke-rc.d/system), lorsque cela est possible, plutôt que d'appeler le script init (/etc/init.d/package) et retomber sur le script /etc/init.d lorsqu'aucun wrapper n'est disponible.

5
Panther

Un meilleur moyen pour les systèmes systemd est d'utiliser deb-systemd-invoke .

0
Razvan Grigore