Étant donné qu'Ubuntu s'appuie sur la mise à jour depuis un certain temps maintenant, je voudrais utiliser une tâche de mise à jour pour arrêter gracieusement certaines applications lors de l'arrêt ou du redémarrage du système. Il est essentiel que l'arrêt ou le redémarrage du système soit bloqué jusqu'à l'arrêt de ces applications.
Les applications seront démarrées manuellement à l'occasion, et à l'arrêt du système devraient être automatiquement terminées par un script (que j'ai déjà). Étant donné que les applications ne peuvent pas être fermées de manière fiable sans (presque tous) les autres services en cours d'exécution, la fermeture des applications doit être effectuée avant le début de la fermeture.
Je pense que je peux résoudre ce problème par un travail parvenu qui sera déclenché à l'arrêt, mais je ne sais pas quels événements je dois utiliser de quelle manière. Jusqu'à présent, j'ai lu les déclarations suivantes (en partie contradictoires):
- Il n'y a pas d'événement d'arrêt général dans le démarrage
- Utilisez une strophe comme
start on starting shutdown
dans la définition de poste - Utilisez une strophe comme
start on runlevel [06S]
dans la définition de poste - Utilisez une strophe comme
start on starting runlevel [06S]
dans la définition de poste - Utilisez une strophe comme
start on stopping runlevel [!06S]
dans la définition de poste
De ces recommandations, les questions suivantes se posent:
- Y a-t-il ou n'y a-t-il pas un événement d'arrêt général dans le début d'Ubuntu?
- Quelle est la méthode recommandée pour implémenter un «crochet d'arrêt»?
- Quand les événements sont-ils déclenchés au niveau d'exécution [x]; est-ce lorsque vous êtes entré dans le niveau d'exécution ou lors de l'entrée dans le niveau d'exécution?
- Pouvons-nous utiliser quelque chose comme
start on starting runlevel [x]
oustart on stopping runlevel [x]
? - Quelle serait la meilleure solution à mon problème?
Merci beaucoup
startup
événement distingué est que quelque chose est nécessaire pour "amorcer la pompe". Après l'envoi d'un événement privilégié, tout le reste peut être, et est, défini par les travaux et tâches déclenchés parstartup
. Quant au fait qu'il n'y ait pas un seulshutdown
événement, il y a trop de types différentsshutdown
pour que cela ait un sens. Mieux vaut dépendre directement des travaux que vous devez exécuter.on stopping servicea or stoping serviceb or ...
pour tous les services dont vous avez besoin.Afin d'arrêter l'arrêt de continuer pendant que votre travail s'arrête, vous voudrez utiliser ceci:
Cela fonctionnera car la première chose qui se produit lorsque vous tapez «shutdown» est que le niveau de tunel 0 est émis. rc démarre au niveau d'exécution, et la transition entre arrêt -> démarrage bloquera complètement jusqu'à ce que les travaux qui doivent également changer d'état terminent cet état.
Vous voudrez vous assurer que votre processus répond rapidement à SIGTERM. S'il ne répond pas dans les 5 secondes, le parvenu lui enverra SIGKILL. Vous pouvez augmenter cela avec 'kill timeout X'.
Le 1 là-dedans, btw est un peu délicat, vous devez vous assurer que votre démarrage inclut quelque chose qui commence au niveau d'exécution [2345] à ce moment-là, afin qu'un utilisateur descendant pour la maintenance en mode utilisateur unique redémarre son travail. Heureusement, beaucoup de travail a été fait pour en faire le début habituel suggéré
Dans certains cas, vous avez également besoin de quelque chose pour continuer à fonctionner jusqu'à ce que le réseau soit arrêté (comme dbus / network-manager). Pour ça tu veux
Il s'agit d'un événement émis plus tard lors de l'arrêt qui sera également bloqué jusqu'à ce que les travaux qui l'utilisent terminent complètement leurs transitions dans l'état.
la source
start on starting ...
cela n'a pas beaucoup de sens d'avoir mon crochet d'arrêt sur quoi que ce soit.start on starting rc RUNLEVEL=[016]
aurait beaucoup plus de sens. Et peut-être untask
jeton là-bas pour s'assurer qu'il peut se terminer avant que d'autres choses ne fonctionnent.Geekosaur, merci beaucoup pour votre aide.
En attendant, j'ai essayé la
start on runlevel [016]
méthode, mais ça n'a pas marché, et je pense comprendre pourquoi:Le travail a bien été démarré, mais le processus d'arrêt n'a pas été bloqué jusqu'à la fin de la tâche du travail. Je suis maintenant certain que les événements
starting
etstopping
sont les seuls événements qui peuvent être utilisés dans une définition de travail pour bloquer d'autres travaux, et je pense que c'est ce que les manuels d'Upstart essaient de nous dire. Par conséquent, l'utilisation de l'événement de niveau d'exécution ne conduira jamais au blocage d'autres travaux ou au processus d'arrêt; ainsi, il est inutile pour mon but.Au lieu de cela, il me semble avoir deux possibilités:
Suite à l'une de vos propositions, recherchez tous les emplois dont les applications respectives ont besoin et incluez-les tous dans l'événement de démarrage du script comme celui-ci:
C'est tellement de travail que je pense sérieusement à vider la liste des tâches et à la parcourir à travers sed pour produire automatiquement une strophe de démarrage pour ma tâche qui inclut toutes les tâches qui s'exécutent normalement sur le système.
L'avantage serait que les applications respectives seraient fermées même si quelqu'un arrête manuellement l'une des conditions préalables (au lieu de les arrêter par un changement / arrêt / redémarrage du niveau d'exécution).
Trouvez le seul travail qui sera arrêté au début lors du redémarrage / arrêt du système (appelons ce travail "FirstJob") et utilisez ce travail dans une strophe comme:
Les principaux inconvénients seraient que je ne sais pas du tout si un tel travail existe et si ce travail dépend vraiment de tous les autres emplois dont dépend l'application réelle ("dépend d'un autre travail" signifie dans ce cas "sera arrêté" complètement avant que l’autre travail ne s’arrête ").
Je ne sais pas laquelle des deux possibilités est la meilleure ...
la source
sed
script en ce moment, si j'étais à votre place.