IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Surveillance et Redémarrage automatique d'une application


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut Surveillance et Redémarrage automatique d'une application
    Bonjour à tous,

    Je débute complétement sous linux et je bloque sur un problème.

    Je lance sur une distribution Ubuntu Dapper un serveur de jeux. Jusque la, tous va bien. Je lance ensuite un deuxième serveur sur un second port. Tout fonctionne à merveille.

    Je regarde donc à l'aide de la commande # top les processus en cours d'exécution et je vois bien mes 2 serveurs fonctionner.

    PID : 2885 - COMMAND : HLDS_I486
    PID : 2888 - COMMAND : HLDS_I486

    Mon problème : Je souhaiterais que si un des serveurs plante, il soit automatiquement remis en route par le serveur.

    J'ai donc trouver ce script sur le net :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    while true; do
    tache_a_executer &
    echo 'tache en cours d'execution..'
    wait
    echo 'Tache terminee. Redemarrage dans 5 secondes...'
    sleep 5
    Le soucis, c'est qu'avec ce script, le serveur ne sait pas exactement quel processus il doit surveiller. Enfin, il sait qu'il doit surveiller HLDS_I486 mais il ne sait pas forcément si il y en a un qui est planté.

    Donc, je voudrai renommer l'application lancée selon le numéro du serveur :

    HLDS_I486_Serveur 1
    HLDS_I486_Serveur 2

    Jusque la, pas de soucis je pense savoir faire mais je ne suis pas sur que cela va fonctionner.

    Donc, pour surveiller mes applications voici le script que je pense écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    while true; do
    /home/serveur1/hlds_l/hlds_i486_serveur1 &
    wait
    sleep 5
    1ère Question/ Mon script est il correcte ?

    Si il ne l'est pas pourriez vous m'indiquer mes erreurs et éventuellement me le réécrire correctement.

    2ème Question/ Le PID d'un processus est il toujours le même ?

    Si tel est le cas, ne serait il pas plus simple de vérifier que le serveur est en route par le numéro de son processus ? et si oui, quel script dois je utiliser.

    Merci d'avance pour vos réponses.

  2. #2
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Tu pourrais faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    while true; do
    /home/serveur1/hlds_l/hlds_i486_serveur1 &
    wait $!
    sleep 5
    $! étant le PID du processus lancé.

    Sinon tu peux surveiller le processus en utilisant /proc/$PID/status !
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Une solution elegante consiterai a ajouter ton appliquation au fichier /etc/inittab en mode respawn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    app1:35:respawn:/le-repertoire/mon_application_1
    app2:35:respawn:/le-repertoire/mon_application_2
    ...
    le premier parametre est un identifiant arbitraire
    le 2eme un run level (ou plusieur ici 3 et 5) ou l'application doit etre lancer et surveillé par init
    le 3eme le mode de lancement respawn correspondant a ce que tu desire : si le process se termine (anormalement ou pas) il est relancé
    le 4eme c'est la commande avec ces eventuelle parametre


    Attention toutefois, si l'application plante (bug par exemple) elle serra relancée et replanterra .... at vitam eternal ........
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  4. #4
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    La solution de MarcG est la meilleure, à mon sens. En l'utilisant le système gérer le processus, tu le laisses entre de bonnes mains

    Citation Envoyé par Trebor
    2ème Question/ Le PID d'un processus est il toujours le même ?
    Non, le PID est attribué par le système au lancement du processus. Il change donc à chaque fois.
    Et c'est heureux, sinon tu ne pourrais lancer qu'un nombre limité (et pas par les ressources !) de processus sur ton PC
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    Bon, je viens de modifier mon inittab de trois façons différentes :

    app1:35:respawn:/usr/local/games/hlds/servhl101/./hlds_run -console -game cstrike -port 27015 +map de_dust2 +maxplayers 21

    app1:35:respawn:/usr/local/games/hlds/servhl101/hlds_run -console -game cstrike -port 27015 +map de_dust2 +maxplayers 21

    app1:35:respawn:/usr/local/games/hlds/servhl101/./hlds_run -console -game cstrike -port 27015 +map de_dust2 +maxplayers 21 &

    app1:35:respawn:/usr/local/games/hlds/servhl101/hlds_run -console -game cstrike -port 27015 +map de_dust2 +maxplayers 21 &

    Ca ne fonctionne pas. grrr...

    Quelqu'un aurait il une idée ?

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    Encore une autre petite question, plutôt que de faire une boucle, j'ai éventuellement l'idée de créer une tache crontab qui regarderait si le pidfile est présent et si oui, il ne fait rien et sinon, il redemarre le script.

    Le hic... Y'a tjrs un hic...

    Quelle commande utiliser dans mon script pour créer un pidfile du nom de mon appli par exemple : app1.pid

    et tout ca dans le dossier /var/run/

    Voila. Merci d'avance pour vos réponses.

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    alors pour le inittab, j'ai réussi en lançant un script bash plutôt que mon appli

    problème, la ressource processeur monte en flèche

    donc je suis reparti avec ma boucle infinie mais problème, j'ai ce message qui s'affiche :

    line 6: syntax error: unexpected end of file

    Voila le détail du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    while true; do
    ./hlds_run -console -game cstrike -port 27015 +map de_dust2 +maxplayers 21 &
    wait $!
    sleep 5
    Edit : Je suis sous Gentoo 2006

  8. #8
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Trebor
    line 6: syntax error: unexpected end of file
    Voila le détail du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    while true; do
    ./hlds_run -console -game cstrike -port 27015 +map de_dust2 +maxplayers 21 &
    wait $!
    sleep 5
    Il se termine où ton while ?
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 229
    Points : 91
    Points
    91
    Par défaut
    C'est une boucle infinie, elle ne se termine pas.

    Ce scprit devrait redemarrer automatiquement le serveur au cas ou un utilisateur arreterais le serveur.

    Car si on envoie la commande pour arreter le serveur, celui ci s'arrete et ne redemarre pas.

    C'est pour cela que je souhaite reussir à faire fonctionner ce script.

  10. #10
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Trebor
    C'est une boucle infinie, elle ne se termine pas.
    L'ordinateur ne peut pas deviner quelle(s) instruction(s) tu souhaite exécuter dans ta boucle. Il faut le lui indiquer.
    Il manque la fin du WHILE. La syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while commande
    do
    	liste_commandes
    done
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redéployement automatique d'une application
    Par domen dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 26/01/2008, 12h07
  2. Réponses: 7
    Dernier message: 16/06/2007, 12h03
  3. Réponses: 4
    Dernier message: 09/03/2007, 19h19
  4. demarrage automatique d'une application sur gnome
    Par Jérémy Lefevre dans le forum Gnome
    Réponses: 6
    Dernier message: 12/02/2007, 09h04
  5. Réponses: 5
    Dernier message: 11/05/2006, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo