De init.d à upstart, y a-t-il un pont?

11

J'ai un très bon script à utiliser dans /etc/init.d. En fait, j'en ai beaucoup, tous créés avec le Tanuki Java Service Wrapper.

Il me semble qu'il pourrait y avoir un modèle simple pour emballer un tel script shell en tant que script parvenu, mais un peu de recherche sur Google n'en révèle pas un.

Suis-je en train de manquer quelque chose?

bmargulies
la source

Réponses:

9

Je ne me souviens pas avoir vu un modèle pour cela. C'est un peu ironique, cependant, que techniquement, c'est son début qui démarre votre script init.d en premier lieu grâce au travail de compatibilité descendante rc et rcS.

J'envisagerais de réécrire tout ce que vous avez comme un travail parvenu, cependant, je sais que certains scripts sont difficiles à convertir, alors voici ce que j'ai fait pendant un certain temps sur certains de mes scripts:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

Maintenant, selon la nature du service, qu'il persiste ou se dérobe lui-même, vous devrez peut-être ajouter expect forkou taskau fichier de travail.

Juste pour terminer la réflexion, généralement, c'est de toute façon tout ce qu'il y a à faire dans un dossier de travail complet. Tout le travail de pré-démarrage est effectué, tout le nettoyage est effectué, la seule chose qui reste est le service lui-même qui est généralement ajouté avec:

exec service_cmd
KFro
la source
Dans upstart, la documentation indique que les niveaux d'exécution 3,4 et 5 ne sont pas utilisés. Donc, vous devez simplement utiliser le niveau d'exécution 2.
djangofan
cela fait un moment, mais je suis à peu près sûr que 5 est en place avec une interface graphique démarrée, du moins c'était le cas auparavant.
Joseph Rogers
6

Donc, un point des emplois parvenus est d'être simple à écrire.

Il y a beaucoup de magie de script shell dans les scripts init.d qui se répète encore et encore. Déclarations de cas, suivi de pidfile, lignes de commentaires LSB. Ce n'est pas très clair comment écrire un bon script init.d sans en avoir lu un.

Si vous avez déjà eu du mal à écrire tout cela, alors vous n'avez pas besoin d'un travail parvenu à moins que, comme je l'ai mentionné dans un autre commentaire, vous ne dépendiez d'un autre travail / événement parvenu.

Mais vraiment, le parvenu rend les choses vraiment simples. Vous ne devriez pas avoir besoin d'un pré-démarrage, sauf si vous devez configurer des choses comme tmpdirs, ulimits ou arguments d'exécution. Vous ne devriez pas avoir besoin d'un post-stop, sauf si vous voulez vous assurer de bien ranger après un service (le service devrait vraiment se nettoyer après lui-même à la sortie normale).

Souvent, un script init.d géant avec de nombreuses options se résume à un travail de démarrage de 10 à 15 lignes. Les scripts init.d les plus complexes peuvent avoir la plupart de leur logique déversée dans les pré-démarrages. La clé est que ce n'est qu'un petit extrait de code pour configurer l'environnement du processus, et non une logique de gestion de démarrage / arrêt / réapparition / etc.

La partie la plus difficile, et celle que les gens se trompent le plus souvent, est de savoir quand commencer / arrêter leur travail. start on runlevel [2345]semble logique, mais ignore le fait que le réseau monte en parallèle à ce stade, tout comme les montages de systèmes de fichiers locaux. L'essentiel est d'essayer de déterminer exactement le minimum dont vous avez besoin (autres services, systèmes de fichiers, réseau, etc.) pour démarrer et de commencer lorsque cela est fait. La plupart des services réseau traditionnels devraient faire l'affaire start on (local-filesystems and net-device-up IFACE!=lo).

SpamapS
la source
3

Je pensais que Upstart maintient la compatibilité descendante avec les scripts d'initialisation de style SysV dans /etc/init.d. Vous devriez pouvoir utiliser vos scripts d'initialisation sans les modifier.

Ryan C. Thompson
la source
C'est le cas, mais l'ordre n'est plus aussi facile à prévoir. Les tâches parvenues peuvent démarrer avant / après l'exécution de votre script rc2.d / S99mything. Ainsi, dès que vous dépendez d'un service géré parvenu, vous avez besoin d'un travail parvenu.
SpamapS
2
En tant que hack, vous pouvez supprimer vos scripts d'initialisation de niveaux d'exécution spécifiques et ajouter à la place un groupe de lignes similaires /etc/init.d/myservice startà /etc/rc.local, dans le bon ordre. Cela garantira que vos services démarrent en dernier, après tous les autres services, y compris ceux démarrés par les scripts d'initialisation Upstart.
Ryan C. Thompson