7
votes

Pourquoi mon script de Debian postinst n'est-il pas exécuté?

J'ai fait un .deb de mon application à l'aide de FPM : xxx

entre autres choses, le script postinst est censé créer un utilisateur pour l'application: xxx

Il semble que le script postinst est appelé avec configurer , mais pas avec installer , et j'essaie de comprendre pourquoi. Dans /var/log/dpkg.log , je vois les lignes que je voudrais attendre: xxx

j'ai vérifié que / etc / par défaut / myApp n'existe pas. Le fichier /var/lib/dpkg/info/myapp.postinst est existez , et si je l'exécute manuellement avec Installez comme premier paramètre, cela fonctionne comme prévu.

Pourquoi le script postinst n'est-il pas exécuté avec Installer ? Que puis-je faire pour déboguer cela plus loin?


0 commentaires

3 Réponses :


18
votes

Je pense que l'exemple de script que vous avez copié est tout simplement faux. postinst n'est pas censé être appelé avec tout installer ou mise à niveau argument, toujours. La définition faisant autorité du format DPKG est la politique de Debian Manuel. La version actuelle décrit postinst dans 6 et seulement répertorie configure , abort-mise à niveau , avortez-supprimer , Abort-Supprimer et Abort-Deconfigure Atel possible d'abord arguments.

Je n'ai pas la confiance totale dans ma réponse, parce que votre mauvais exemple est toujours sur Debian.org et il est difficile de croire qu'un tel bogue pourrait glisser à travers.


3 commentaires

Ah, selon la section 6.5 dans le manuel de politique de Debian, il semble que c'est Preinst qui est exécuté avec Configurer et Installez . Le manuel de succession de Debian parle en fait de " Preinst ou postinst ", donc leur exemple doit être destiné à Preinst . Je vais essayer de réorganiser.


Aha! Cela a du sens maintenant. Faites-le à Preinst s'il y a autre chose que vous faites déjà dans la préinstance qui dépend de l'utilisateur créé. Sinon, 1 $ après la branche de configuration de Postinst. C'est là que la plupart des colis semblent le faire selon ma numérisation rapide de /var/lib/dpkg/info/*.postinst


Peut-être que quelque chose a changé depuis 2012, mais je pense que postinst s est exécuté après l'installation, peut-être juste dans des cas spécifiques. J'installisiez PHPMYADMIN sur un serveur Debian et l'installation, bien que la provision réussie, échouait à la suite de son script postinst . Ce voyant apt-get pour penser qu'il n'était pas installé correctement. Une fois que j'ai modifié /var/lib/dpkg/info/phpmyadmin.postinst Ça a fonctionné. En outre, mon système a 277 postinst S et seulement 75 Preinst s et exécutant un script après l'installation semble plus susceptible d'être populaire que après supprimer . Peut-être que c'est juste un paquet mal entretenu.



4
votes

Je crois que la réponse fournie par Alan Curry est incorrecte, au moins à partir de 2015 et au-delà.
Il doit y avoir une faute de la manière dont votre colis est construit ou une erreur dans le fichier postinst code> qui cause votre problème.
Vous pouvez déboguer votre installation en ajoutant l'option -d code> (débogage) à votre ligne de commande, c'est-à-dire: xxx pré>

-d2 code> devrait trier Ce type de problème p>

pour l'enregistrement Les niveaux de débogage sont les suivants: P>

          1. Extract the control files of the new package.

          2.  If  another version of the same package was installed before
          the new installation, execute prerm script of the old package.

          3. Run preinst script, if provided by the package.

          4. Unpack the new files, and at the same time back  up  the  old
          files, so that if something goes wrong, they can be restored.

          5.  If  another version of the same package was installed before
          the new installation, execute the postrm script of the old pack‐
          age.  Note that this script is executed after the preinst script
          of the new package, because new files are written  at  the  same
          time old files are removed.

          6.  Configure the package. 

          Configuring consists of the following steps:

          1.  Unpack  the  conffiles, and at the same time back up the old
          conffiles, so that they can be restored if something goes wrong.

          2. Run postinst script, if provided by the package.


2 commentaires

Ce n'est pas totalement clair pour moi ce que vous dites ici à propos de "la commande installer ", mais si cela aide à clarifier les éléments pour quiconque, dpkg n'appelera jamais un script postinst avec $ 1 = Installez ou Mettez à niveau . Rien ne vous empêche de soutenir des actions supplémentaires dans votre postinst si vous le souhaitez, mais DPKG ne les utilisera pas. Le script publié dans la question initiale ne fonctionne pas car il s'attend à être appelé l'un de ceux-ci. Peut-être que c'est la faute du fpm? Je ne sais pas.


@thepaul je pensais que j'étais clair. La commande d'installation appelle l'option Configurer . Spécifiquement, il appellera le script postinst avec configurer et la version du package E.G. configure 6.4.0 (dans mon expérience, d'emballage mon propre logiciel)



1
votes

C'est une ancienne question qui a été résolue, mais il me semble que la solution acceptée n'est pas totalement correcte et je pense qu'il est nécessaire de fournir des informations à ceux qui, comme moi, ont le même problème. < / p>

Chapitre 6.5 Détails tous les paramètres avec lesquels Les fichiers Preinst et postinst sont appelés

à https://wiki.debian.org/maintainerscripts Le flux d'installation et de désinstallation est détaillé .

Regardez ce qui se passe dans le cas suivant:

package d'installation apt-get - Il fonctionne PREINST INSTALLST , puis POSTINST CONFIGURE

apt-get supprimer le paquet - Exécuter POSTRM Supprimer et le package sera défini sur " Fichiers de configuration "

Pour que le colis soit réellement dans l'état " non installé ", il doit être utilisé:

Package de purge APT-GET

C'est la seule façon de pouvoir exécuter PREINST INSTALLST et POSINSTER CONFIGURE La prochaine fois que le package est installé.


0 commentaires