Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/09/2006, 14h09   #1
Futur Membre du Club
 
Inscription : novembre 2005
Messages : 51
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 51
Points : 17
Points : 17
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 :
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 :
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.
Trebor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 10h18   #2
Membre éprouvé
 
Avatar de Tchetch
 
Inscription : mars 2002
Messages : 401
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2002
Messages : 401
Points : 434
Points : 434
Tu pourrais faire comme suit :
Code :
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/
Tchetch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 15h31   #3
Rédacteur
 
Inscription : mars 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 298
Points : 1 450
Points : 1 450
Une solution elegante consiterai a ajouter ton appliquation au fichier /etc/inittab en mode respawn :
Code :
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/ )
MarcG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 15h39   #4
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
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
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 16h36   #5
Futur Membre du Club
 
Inscription : novembre 2005
Messages : 51
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 51
Points : 17
Points : 17
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 ?
Trebor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 16h39   #6
Futur Membre du Club
 
Inscription : novembre 2005
Messages : 51
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 51
Points : 17
Points : 17
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.
Trebor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 19h01   #7
Futur Membre du Club
 
Inscription : novembre 2005
Messages : 51
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 51
Points : 17
Points : 17
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 :
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
Trebor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 21h45   #8
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Citation:
Envoyé par Trebor
line 6: syntax error: unexpected end of file
Voila le détail du script :
Code :
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
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 23h25   #9
Futur Membre du Club
 
Inscription : novembre 2005
Messages : 51
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 51
Points : 17
Points : 17
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.
Trebor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2007, 06h42   #10
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
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 :
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
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h30.


 
 
 
 
Partenaires

Hébergement Web