Quelle est la bonne façon de redémarrer les services dépendants lors de l'installation du package?

10

Je crée un package de configuration et je souhaite arrêter et redémarrer les services dont la configuration est affectée. En ce moment je suis en utilisant le service [stop|restart]en {pre,post}{inst,rm}chemin. J'ai lu une question quelque part qui invoke-rc.dest la bonne façon, car elle respecte les préférences des utilisateurs concernant un service. Cependant, je n'ai trouvé aucune directive à ce sujet. Quelqu'un connaît-il de telles directives? Ou avez-vous des conseils sur la façon de choisir? Le package est à usage interne et ne sera probablement valable que pour le 14.04 pour les deux prochaines années. Cependant, je voudrais laisser un état aussi propre que possible à mon successeur, c'est aussi systemddans mon esprit.

Depuis la invoke-rc.dpage de manuel :

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

Du manuel de politique de Debian, chapitre 9, section 3.3 :

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

...

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

Debian a utilisé sysv-initet passera directement à systemd, et je suppose que le manuel de politique sera mis à jour en temps voulu pour y faire référence systemctl. Cependant, ce dont je ne suis pas certain, c'est ceci: devrais-je utiliser à la invoke-rc.dplace de service? Je peux dire dpkgque je suis intéressé par certains fichiers (via des déclencheurs), alors y a-t-il un moyen de dire dpkgque je suis également intéressé par certains services et dpkgde faire le redémarrage / rechargement?

Pour clarifier: je n'écris pas de scripts d'initialisation. Je fournis un package avec une configuration pour d'autres applications, comme Puppet, NTP, etc., donc j'arrête et redémarre les services correspondants dans les scripts.

Ici , par exemple, est une question à propos de Docker invoke-rc.dvs service. Le problème est toujours en suspens, une personne, probablement un responsable, a déclaré qu'elle était définitivement intéressée à faire cela de la bonne façon - clairement aucun de nous ne sait ce que c'est. (Ma question est indépendante de cette question.)

muru
la source

Réponses:

5

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

preinst - Ce script s'exécute avant que ce paquet ne soit décompressé de son fichier d'archive Debian (".deb"). De nombreux scripts «preinst» arrêtent les services pour les packages qui sont mis à niveau jusqu'à ce que leur installation ou mise à niveau soit terminée (après l'exécution réussie du script «postinst»).

postinst - Ce script termine 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 de saisir des informations et / ou avertissent l'utilisateur que s'il accepte les valeurs par défaut, il doit se rappeler de revenir en arrière et de reconfigurer ce package si la situation le justifie. De nombreux scripts «postinst» exécutent ensuite toutes les commandes nécessaires pour démarrer ou redémarrer 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'invocation de start | stop | restart est écrite comme conditionnelle, voir https://www.debian.org/doc/debian-policy/ch-opersys.html section 9.3.3.2 Exécuter des scripts de démarrage

si qui invoque-rc.d> / dev / null 2> & 1; puis

paquet invoke-rc.d

autre

/etc/init.d/package

Fi

donc ...

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 un autre conditionnel 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 d'encapsulation approprié (invoke-rc.d / system), si possible, plutôt que d'appeler le script init (/etc/init.d/package) et retomber dans le script /etc/init.d quand aucun wrapper n'est disponible.

Panthère
la source
Cela répond à peu près à la plupart de mes doutes, sauf un. La invoke-rc.dpage de manuel et les documents de politique Debian nous disent de l'utiliser en connexion avec les /etc/init.d/scripts (peut-être parce qu'ils utilisaient toujours sysv-init). Comment cela change-t-il avec Upstart ou systemd?
muru
Mettez à jour votre question ou publiez un lien vers les informations que vous lisez. Je n'ai rien vu dans la page de manuel sur l'emballage. Je suppose que cela dépend de votre service et du script d'initialisation (est-il parvenu? Systemd?) Vous demandez sur askubuntu.com, et ubuntu utilise upstart, donc askubuntu.com/questions/58404/how-to-start-and-stop -un service . Si votre package utilise un ancien script init, il doit être converti en upstart pour l'instant et systemd à long terme.
Panther
J'ai mis à jour la question.
muru
Il n'y a pas de réponse simple ou simple à la question car "cela dépend". C'est un peu une situation temporaire car aller de l'avant avec Ubuntu et Debian utilisera tous les deux systemd. Vous devez utiliser invoke-rc.d pour les services sur Debian (ou Ubuntu) qui utilisent sysv-init et le service ... sur Ubuntu pour les services qui utilisent upstart. C'est du script alors soyez créatif si besoininvoke-rc.d ... || service ...
Panther
Je pensais que vous demandiez si vous deviez utiliser les scripts pré / post inst, pas la syntaxe de votre script.
Panther
0

Une meilleure façon pour les systèmes systemd est d'utiliser deb-systemd-invoke .

Razvan Grigore
la source
1
Veuillez donner plus d'informations sur la façon d'utiliser deb-systemd-invoke.
Cynplytholowazy