Comment superviser et redémarrer automatiquement un processus?


34

Je veux avoir un processus qui sera redémarré s'il se bloque. J'ai un peu cherché sur Google et j'ai trouvé qu'une solution simple consiste à utiliser daemontools .

Je n'ai pas compris comment le configurer.

  1. Quel est le moyen le plus simple de réaliser une telle fonctionnalité?
  2. Comment le configurer?

Réponses:


29

Cette réponse s’applique aux versions Ubuntu avec Upstart (<= 14.10). Utilisez une autre approche pour les versions avec Systemd (> = 15.04).

Il semble que vous recherchiez une fonctionnalité déjà fournie dans Ubuntu avec Upstart . La respawnstrophe de la configuration fera exactement ce dont vous avez besoin. Je recommande de ne pas utiliser une méthode moins standard.

Sans plus de détails sur le processus que vous essayez de gérer, il est difficile de dire à quoi devrait ressembler la configuration. Cela dépend si elle se fourche et se met en arrière-plan par exemple. La documentation de Upstart sur la respawnstrophe devrait vous donner plus d'informations.

Malheureusement, il n’est pas encore possible d’exécuter correctement les travaux d’utilisateur: impossible d’avancer pour exécuter le travail d’utilisateur.

Exemple

Supposons que nous voulions que l'application Calculatrice continue de fonctionner, même lorsqu'elle est tuée par le feu (signal 9).

  1. Créez un fichier de configuration dans /etc/init/calculator.conf(basé sur cet article ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Commencez par courir

    sudo start calculator
    
  3. Il s’ouvre sur votre écran actuel ( :0) et profitez de l’impressionnant en le voyant redémarrer après sa fermeture.

    • Identifiez l'identifiant du processus, par exemple en faisant ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Tuez-le avec le feu.

      sudo kill -9 13695
      
    • Regardez-le réapparaître:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Notez que cela sera plus élégant avec les plans pour les plans Ubuntu 13.04 avec le support utilisateur approprié.


J'obtiens un emploi inconnu quand j'essaie de le démarrer? toute idée. J'ai placé le fichier dans / etc / init
opc0de

@ opc0de Le nom du fichier servicename.confdoit correspondre à la commande à démarrer start servicename. Je suppose que vous avez choisi un nom différent.
Gertvdijk

Non, ça correspond mais je n'ai pas suivi votre exemple, alors je pense que je pourrais avoir une erreur de syntaxe.
opc0de

@ opc0de Eh bien, commencez par expliquer davantage ce que vous essayez d'accomplir dans la question: quel type d'application / processus et comment vous l'exécutez, ainsi que les détails de votre tentative actuelle.
Gertvdijk

Résolue avec votre exemple, mon erreur est que j'ai probablement eu une erreur dans le statut d'exécution. Merci de votre aide!
Opc0de

13

Un outil extrêmement simple qui peut produire le même effet sans nécessiter de configuration est immortal: https://immortal.run/

Exécutez simplement la commande comme ceci:

immortal <cmd>

Il fonctionnera en arrière-plan et redémarrera automatiquement s'il se ferme.

  • immortalctl: Afficher le statut des travaux en cours. Il y a une namecolonne qui sera imprimée ici, vous pouvez l'utiliser pour faire référence au travail avec d'autres commandes de contrôle.
  • immortalctl stop <name>: Arrête de surveiller le travail avec le nom donné (il ne sera pas automatiquement redémarré, mais le processus en cours continuera à s'exécuter)
  • immortalctl -k <name>: Envoie SIGKILL au processus en cours.
  • immortalctl exit <name>: Arrête de surveiller le travail avec le nom donné et le supprime de la liste des travaux.

1
Merci, cela a bien fonctionné pour mon cas d'utilisation de la version 16.04. Mettre cela dans mon sac d'outils utiles.
Quentin Skousen

2
En effet, cela semble plus léger que upstart / respawn.
Sridhar Sarnobat

Y a-t-il un moyen de le faire apparaître stdoutet stderrau premier plan?
David S.

Je n'en connais pas, puisqu'il est généralement utilisé pour exécuter un processus en arrière-plan. Cependant, vous pouvez utiliser immortalctl -l out.log <cmd> && tail -f out.logpour obtenir le même effet.
moteur extropique

@DavidS. vous pouvez obtenir un journal combiné ou avoir stdout et stderr immortal.run/post/stderr
nbari

1

Si vous n'avez pas besoin de la fonctionnalité de processus démon / service / arrière-plan et souhaitez simplement le faire dans la console, créez un fichier appelé autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Puis ./autorestart.shredémarrera automatiquement some_commands'il se ferme ou se bloque. CTRL-C rompt la boucle et quitte le programme proprement.

Testé sur Ubuntu 18.04.


0

Il y a une manière sans "Upstart". Le mot clé est "inittab" :-). Bien que ce fichier ne soit généralement pas modifié par défaut, il peut être utilisé pour obtenir le respawning souhaité sur les ordinateurs SYSV.


Je ne comprends pas pourquoi quelqu'un a REJETÉ cette solution. Si vous ne le comprenez pas, il suffit de le google; inutile de couper et coller ici les pages de manuel d'initttab, vous pouvez les lire vous-même sur votre système! il suffit de taper "man inittab" ...
cepal67

13
Des réponses de haute qualité détaillent plus que "utilise ceci, découvre-le par toi-même" :)
Seth

0

ps-watcher est un outil qui surveille les processus en cours d'exécution et exécute une action dans des circonstances définies. Installons-le:

apt-get install ps-watcher

Voyez le bas de la section Exécution de HHVM avec le recours à PHP-FPM pour plus de détails - cela a bien fonctionné pour moi.


Comme ce n'est pas très long, veuillez ajouter un résumé du code à la place de l'article car seule une très courte section s'applique à cette question.
derHugo

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.