1 votes

Redémarrage du processus dans CentOS si le serveur redémarre

J'ai un VPS avec quelques applications Java (réalisées avec "Play Framework") fonctionnant sur les ports 9000, 9001, 9002 et 9003. Le fournisseur de VPS (iPage) redémarre les serveurs de manière inattendue de temps en temps, laissant les quatre processus hors service.

Les processus que j'exécute sont lancés par

  • nohup ./start -Dhttp.port=9000 ,
  • nohup ./start -Dhttp.port=9001 ,
  • nohup ./start -Dhttp.port=9002 et
  • nohup ./start -Dhttp.port=9003

avec les quatre start réalisés par "Play" et situés dans différents dossiers (à l'intérieur de /opt ).

Chaque fois qu'iPage redémarre mon VPS, les quatre dossiers conservent leur fichier 'RUNNING_PID' avec leur ancien PID, je dois donc supprimer manuellement ces fichiers pour pouvoir les remettre en place.

Je vérifiais cette réponse d'une question relativement similaire ( Comment écrire un bash script pour redémarrer un processus s'il meurt ? ) (sans spécifier de port et nohup style, je suppose) sans succès.

C'est ce que j'ai fait jusqu'à présent :

  • Fait un tryReboot (enregistré dans /opt/myJavaApp9000/ ) avec le contenu suivant :

    until start -Dhttp.port=9000; do
        echo "9000 process crashed with exit code $?.  Respawning.." >&2
        sleep 1
    done
  • Ajouté @reboot /opt/myJavaApp9000/tryReboot au crontab en utilisant crontab -e

Après avoir redémarré le serveur (via iPage Reboot), les quatre ont gardé leur RUNNING_PID mais aucun d'entre eux n'a redémarré. Quel pourrait être le problème ?

0voto

Quel pourrait être le problème ?  Voici quelques possibilités :

  • Relisez la réponse à laquelle vous faites référence.  until [start -Dhttp.port=9000]; do ne devrait pas avoir le [ y ] des crochets.
  • Si vous avez . (le répertoire actuel) dans votre chemin de recherche, vous ne devriez pas avoir besoin de dire ./ lorsque vous exécutez votre start comme vous le faites maintenant.  Si vous Ne le fais pas. ont . dans votre chemin de recherche, vous faire besoin de dire ./start dans votre tryReboot script.
  • Votre tryReboot script ne pourrait pas être exécuté à partir de crontab pour un certain nombre de raisons.  Par exemple, au risque d'insulter votre intelligence, vous ne dites pas que vous avez fait chmod +x tryReboot .  Avez-vous vérifié que tryReboot est en cours d'exécution ?  Peut-être en lui faisant écrire des messages dans un fichier journal ?  Conseil : vous pourriez inclure la date et l'heure dans ces messages en incluant $(date) dans votre echo chaîne.
  • En RUNNING_PID peuvent persister parce qu'il n'y a pas de mécanisme pour les supprimer.  (Si vous avez dit comment vous vous attendez à ce qu'ils soient supprimés, je l'ai manqué).  Vous devriez probablement supprimer le fichier RUNNING_PID au début du fichier tryReboot script ; et, en effet, probablement à chaque itération (car, si vous arrivez à la echo cela signifie que le start est terminée).

Mais c'est difficile de dire ce que es le problème, car votre question n'est pas très claire.

  • Es start le nom de votre programme, et est-ce que vous le lancez vraiment avec une commande comme nohup ./start -Dhttp.port=_port_number_ **&** , ou est start un programme qui bifurque et exécute votre programme dans un processus enfant asynchrone ?  Dans ce dernier cas, l'ensemble du until _command_; do … done est inappropriée.
  • Avez-vous essayé d'exécuter tryReboot manuellement ?  Que se passe-t-il ?

Etc.

0voto

R J Points 570

Envisagez d'utiliser monitrice . Il est conçu spécifiquement pour cette tâche. Il n'est pas nécessaire de réinventer la roue.

Il suffit d'éditer /etc/monit/monitrc, d'ajouter le chemin vers votre script et vous avez terminé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X