scripts init.d écrits en Python

10

Une question est apparue sur StackOverflow concernant l'écriture de init.dscripts en Python. Un commentaire a indiqué que ces scripts devraient être programmés en shell, pas en Python. Est en train d'écrire des init.dscripts en Python:

  1. Mauvais. Mauvais. Mauvais. Ne fais jamais ça.
  2. Pas une pratique recommandée.
  3. OK, avec des mises en garde.
  4. Dogme hérité.
  5. Très bien.

Ce serait formidable de connaître tous les scénarios de cauchemar, ou si cette règle est écrite dans le sang d'un administrateur système.

mjhm
la source

Réponses:

9

Je dirais # 2, mais très proche de # 1 - "Mauvais. Mauvais. Mauvais. Ne fais jamais ça." La norme, telle qu'elle est, pour les scripts d'initialisation Linux est dans le LSB , et même si elle ne sort jamais et dit "ce sont des scripts shell bourne", plusieurs hypothèses sont faites. Premièrement, les lignes commençant par # sont des commentaires. Plus problématique est l'exigence que le script init exécute les commandes à partir de /lib/lsb/init-functions"dans l'environnement actuel (voir point de commande intégré spécial shell)".

Mais plus important encore, si vous faites quelque chose de vraiment compliqué ici, vous le faites mal. Les scripts d'initialisation doivent être très simples et utilitaires. Ce doivent être des scripts au sens classique, pas des programmes. Il est préférable de le sucer et de créer un script shell simple que tout administrateur système peut facilement comprendre en un coup d'œil plutôt que de créer quelque chose de beau et conçu en Python.

Une autre considération à garder à l'esprit est systemd, qui peut être ou non l'initialisation du futur de tous les systèmes sous Linux. Sous systemd, l'initialisation se fait par de simples fichiers de configuration plutôt que par des scripts, l'idée étant que tout le démarrage s'inscrit dans plusieurs modèles de conception standard et que vous ne devriez en choisir qu'un. Si votre programme utilise quelque chose de compliqué pour l'initialisation, cela devrait aller en dehors du script init lui-même.

mattdm
la source
1
Je vais avec cette réponse. Le fait est que Python n'est pas nécessaire et n'est pas standard, et en tant que tel, il peut créer un point supplémentaire d'incertitude de débogage et un point supplémentaire d'échec. En référence à la question SO originale, je suppose que ces scripts peuvent lancer des démons, mais ils ne devraient pas être les démons réels.
mjhm
si je me souviens bien, toutes les distributions ne suivent pas LSB. voir debian.
Massimo
10

Je ne vois pas de problème avec cela, si vous savez, à coup sûr, que l'interpréteur Python sera disponible lorsque le script init.d sera exécuté. Cela, pour moi, indique que vous regardez quelque chose qui est fait relativement tard dans un niveau d'exécution multi-utilisateur (ou "console graphique").

Cependant ... Cela signifie qu'une version spécifique de l'interpréteur Python PEUT être vitale pour votre séquence de démarrage et c'est un autre élément que vous devez vérifier lors des mises à niveau.

Je suppose que cela signifie que je dis "3. OK, avec des mises en garde".

Vatine
la source
4
+1. Exactement ce que j'écrivais. Les seuls "problèmes" ici seraient de s'assurer que vous vous conformez à LSB, (par exemple en fournissant les fonctions nécessaires) et de vous assurer que l'interpréteur python dont vous avez besoin est disponible au moment de l'exécution (et non cassé.)
Sam Halicke
3
Disponible à l'exécution peut être compliqué si l'utilisateur a choisi d'avoir / usr sur une partition séparée. Il sera important que votre script s'exécute après le montage de / usr car python est généralement installé dans / usr.
Zoredache
@Zoredache - Ayup. En règle générale, vous savez que "s'est produit" lorsque vous êtes en retard dans la séquence RC "multi-utilisateur".
Vatine
2

Je suis d'accord avec "3. OK, avec des mises en garde", mais pour des raisons différentes. D'après mon expérience sur Solaris, ils avaient une copie du système d'exploitation de Perl pour certains de leurs programmes internes. Le script shell n'était rien d'autre que le shell pour faire démarrer Perl. Le script de démarrage devait-il être écrit en sh? Non, mais cela a amélioré la maintenabilité pour l'administrateur. Et le script d'initialisation n'a rien de plus compliqué que des choses comme daemon --startou daemon --stop. Si vous faisiez cela, les utilisateurs réguliers pourraient démarrer votre outil en mode non privilégié, si cela avait du sens dans le contexte de votre programme. Et ils n'auraient pas besoin d'avoir toutes sortes de réglages compliqués pour être fin.

Les distributions Linux modernes, même celles qui utilisent encore init.d, ont une large collection de fonctions prédéfinies destinées à faciliter la gestion des démons. Les processus de démarrage graphiques exploitent régulièrement ces fonctions pour conserver le joli logo à moins qu'un des scripts de démarrage ne commence à cracher des erreurs. Votre code Python (ou tout autre langage) peut ne pas bien fonctionner avec ces schémas.

Si vous ne vous souciez pas de l'esthétique ou de la maintenabilité, votre script d'initialisation peut être écrit comme vous le souhaitez. J'ai vu de nombreux administrateurs, qui ne peuvent même pas couper et coller correctement, ignorer complètement les arguments de ligne de commande et ils démarrent simplement le démon. Aucun arrêt, état ou redémarrage. C'était immature, mais leur code fonctionnait toujours.

zerolagtime
la source
1

Je dis entre # 1-2. Le LSB vous dirige de cette façon .. et à partir d'un Sys-Admin (rôle non-dev), la demande de dicte les connaissances sh / bash, PAS le niveau de développement (ou même une compréhension légère) de python, PHP ou perl. C'est pour la pile LAMP, pas pour les scripts d'initialisation du système.

Tweeks
la source