Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1876 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Plusieurs daemon dans un même script.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Plusieurs daemon dans un même script.

n°831302
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 08:47:53  profilanswer
 

Bonjour,
Je voudrais créer un script qui se lance lors d'un reboot mais pouvant aussi être utilisé pour vérifier le status de chaque daemon.
Ex : ~$ ./reload.sh status serveur1
      ~$ serveur1 is UP !
J'ai actuellement un script pour chaque service mais c'est vraiment lourd à la longue, si il est possible de tout regrouper ça me faciliterait la vie.
Voilà mon script :

Code :
  1. #! /bin/sh
  2. #
  3. # Reboot Machine
  4. #
  5. # The user that will run services
  6. USER=user
  7. PATH=/bin:/usr/bin:/sbin:/usr/sbin
  8. # Screen name
  9. NAME1=serveur1
  10. NAME2=serveur2
  11. NAME3=serveur3
  12. NAME4=serveur4
  13. NAME5=serveur5
  14. NAME6=serveur6
  15. NAME7=serveur7
  16. NAME8=ventrilo
  17. NAME9=teamspeak
  18. # Path where services are.
  19. DIR1=/home/user/dir
  20. # Daemon to load. Leave this alone !
  21. DAEMON=serveur1_srv
  22. DAEMON2=ventrilo_srv
  23. DAEMON3=teamspeak2-server_startscript
  24. # Options Daemon:
  25. PARAMS="......................."
  26. # Service name.
  27. DESC="Serveur No 1"
  28. DESC2="Serveur No 2"
  29. case "$1" in
  30. start)
  31.     if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
  32.        then
  33.        echo "Service is already running!"
  34.     else
  35.        echo "Starting $DESC: $NAME"
  36.        su $USER -c "cd $DIR; screen -dmS $NAME ./$DAEMON $PARAMS"
  37.     fi
  38.     ;;
  39. stop)
  40.     if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
  41.        then
  42.        echo -n "Stopping $DESC: $NAME"
  43.        kill `ps auxwww | grep -v grep | grep -i $USER | grep -i screen | grep -i $NAME | awk '{print $2}'`
  44.        echo " ... done."
  45.     else
  46.        echo "Coulnd't find a running $DESC"
  47.     fi
  48.     ;;
  49. restart)
  50.     if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
  51.        then
  52.        echo -n "Stopping $DESC: $NAME"
  53.        kill `ps auxwww | grep -v grep | grep -i $USER | grep -i screen | grep -i $NAME | awk '{print $2}'`
  54.        echo " ... done."
  55.     else
  56.        echo "Coulnd't find a running $DESC"
  57.     fi
  58.  
  59.     echo -n "Starting $DESC: $NAME"
  60.     su $USER -c "cd $DIR; screen -dmS $NAME ./$DAEMON $PARAMS"
  61.     echo " ... done."
  62.     ;;
  63. status)
  64.     ps aux | grep -v grep | grep serveur1 > /dev/null
  65.     CHECK=$?
  66.     [ $CHECK -eq 0 ] && echo "Service is UP" || echo "Service is DOWN"
  67.     ;;
  68. *)
  69.     echo "Usage: $0 {start|stop|status|restart}"
  70.     exit 1
  71.     ;;
  72. esac
  73. exit 0


 
La partie "status)" déjà est mal foutue, il me sera impossible de pouvoir choisir le process à vérifier. Quant aux autres start), etc ... je ne sais pas quoi modifier pour rendre compatible multi-daemon.
J'espère avoir été assez clair dans mon explication.
J'attends une réponse de votre part.
Merci d'avance.

mood
Publicité
Posté le 31-07-2006 à 08:47:53  profilanswer
 

n°831306
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 31-07-2006 à 09:08:15  profilanswer
 

utilise un case sur un second argurment [:spamafote]


case "$2" in:
a) bla
b) bli


 
que tu places où tu veux pour choisir ton service.
 
Après tu peux décider d'être plus générique et de faire une sorte de système "hook" pour chaque daemon mais si tu vois pas le principe mieux vaut rester simple ;)
 
note pour ton "stop" : plutot qu'un pid obtenu à grand coup de grep ([:pingouino]) mieux vaut inscrire le pid au lancement dans un fichier et le lire ensuite (généralement /var/run/nom_daemon.pid)
 
y'a pas mal de trucs à revoir dans ton script, mais c'est comme ça qu'on apprend :)


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°831309
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 09:24:32  profilanswer
 

Très bien merci :D
Pour le case 2, comment faire pour spécifier le service dont je souhaite connaître l'état ?
Là avec ce que tu me dis j'avance c'est déja ça maintenant reste à savoir comment activer, stopper et connaître le status de chaque case*.
Merci  :jap:  

n°831311
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 31-07-2006 à 09:34:26  profilanswer
 


[nico:~] cat >| mon_script
#!/usr/bin/env bash
echo "mes arguments :"
echo $*
echo "le premier :"
echo $1
echo "le second :"
echo $2
echo "nombre d'arguments :"
echo $#
 
echo "man bash pour plus d'infos"
[nico:~] chmod +x mon_script  
[nico:~] ./mon_script pouet hip
mes arguments :
pouet hip
le premier :
pouet
le second :
hip
nombre d'arguments :
2
man bash pour plus d'infos


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°831322
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 10:45:30  profilanswer
 

D'accord j'ai compris le principe mais comment faire correspondre l'argument $2 au différent case ?
$ ./reload.sh start service1

Code :
  1. case "$1" in
  2. start)
  3.     if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
  4.        then
  5.        echo $2 "is already running!"
  6.     else
  7.        echo "Starting $DESC: $NAME"
  8.        su $USER -c "cd $DIR; screen -dmS $NAME ./$DAEMON $PARAMS"
  9.     fi
  10.     ;;


 
Là il va me sortir "service1 is already running!"
Mais il en sera de même pour service2, service*
Faut-il que je fasse un truc du genre :

Code :
  1. if case "$2" "$NAME1"
  2. echo $2 "starting !"
  3. su $USER -c "cd $DIR; screen -dmS $NAME ./$DAEMON $PARAMS"
  4. fi


Et cela pour tous les $NAME* ?
En fait je ne comprends pas la structure du script.
case $1 1er argument OK genre start stop ...
case $2 le service concerné.
Mais pour ce qui est d'imbriquer tout ça je galère.
 :sweat:


Message édité par Badgerkiller le 31-07-2006 à 10:46:34
n°831330
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 31-07-2006 à 11:28:21  profilanswer
 

tu peux imbriquer les cases ;)


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°831364
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 12:38:45  profilanswer
 

Bon j'ai fait ça et ça fonctionne :

Code :
  1. case "$1" in
  2. start)
  3.     case "$2" in
  4.     $NAME1)
  5.     if [[ `su $USER -c "screen -ls |grep $NAME1"` ]]
  6.        then
  7.        echo "$2 is already running!"
  8.     else
  9.        echo "Starting $NAME1 $DESC"
  10.        su $USER -c "cd $DIR1; screen -dmS $NAME1 ./$DAEMON1 $PARAMS1"
  11.     fi
  12.     ;;
  13.     all)
  14.     if [[ `su $USER -c "screen -ls |grep $NAME1"` ]]
  15.        then
  16.        echo "$2 services are already running!"
  17.     else
  18.        echo "Starting $NAME1 $DESC"
  19.        su $USER -c "cd $DIR1; screen -dmS $NAME1 ./$DAEMON1 $PARAMS1"
  20.     fi
  21.     esac
  22.     ;;
  23. *)
  24.     echo "Usage: $0 {start}"
  25.     exit 1
  26.     ;;
  27. esac
  28. exit 0


 
Bon là c'est juste pour start.
Il faut que je fasse tout ça pour chaque $NAME c'est un peu lourd quand même.
Ya pas un système d'alias en début de script qui pourrait m'aider à mieux organiser tout ça ?
Exemple : que $NAME corresponde au mot Service et * au numéro du service, au lieu de taper $NAME1, $NAME2 ...
Je m'exprime mal désolé.
Merci


Message édité par Badgerkiller le 31-07-2006 à 12:39:37
n°831378
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 13:41:09  profilanswer
 

Je vais essayer de mieux m'exprimer.
Exemple :

Code :
  1. DAEMON1=servicetruc
  2. DAEMON2=servicebidulle
  3. NAME1=service1
  4. NAME2=service2
  5. PARAMS1="........................"
  6. PARAMS2="........................"
  7.     case "$2" in
  8.     $NAME*)
  9.     if [[ `su $USER -c "screen -ls |grep $NAME*"` ]]
  10.        then
  11.        echo "$2 is already running!"
  12.     else
  13.        echo "Starting $NAME* $DESC*"
  14.        su $USER -c "cd $DIR*; screen -dmS $NAME* ./$DAEMON* $PARAMS*"
  15.     fi
  16.     ;;


Cela me permettrait d'avoir un script type pour tous les services, le numéro spécifé dans ./reload start service(numéro) associerait donc NAME, DAEMON, PARAMS selon le numéro de service.
Malheureusement "*" n'est pas la bonne syntaxe pour ce que je désire.


Message édité par Badgerkiller le 31-07-2006 à 13:41:23
n°831402
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 31-07-2006 à 14:42:16  profilanswer
 

perso j'utiliserai un fichier pour stocker les infos sur les services et j'utiliserai la commande "source" pour les charger dans mon script
 
comme ça tu modifies juste ton fichier de description, comme un fichier de conf en fait et avec 2/3 fonctions ça roule tout seul


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°831403
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 14:44:06  profilanswer
 

Ok très bien je vais faire ça merci à toi :D
Et pour introduire la source il y a une syntaxe spécifique à foutre dans le script ?


Message édité par Badgerkiller le 31-07-2006 à 14:47:18
mood
Publicité
Posté le 31-07-2006 à 14:44:06  profilanswer
 

n°831408
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 31-07-2006 à 14:57:58  profilanswer
 

source mon_fichier [:spamafote]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°831411
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 15:25:09  profilanswer
 

Ok lol c'est si con que ça :D

n°831457
Badgerkill​er
J'ai la gueule dans le cul !
Posté le 31-07-2006 à 18:02:02  profilanswer
 

Oh pinaise c'est prise de tête ce truc  :pt1cable:  
Voilà quelque chose qui fonctionne  :p  

Code :
  1. case "$1" in
  2. $1)
  3. if [ -e $1.cfg ]; then
  4. source $1*cfg
  5. case "$2" in
  6. start)
  7.      if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
  8.  then
  9.  echo "Service is already running!"
  10.      else
  11.  echo "Starting $DESC: $NAME"
  12.  su $USER -c "cd $DIR; screen -dmS $NAME ./$DAEMON $PARAMS"
  13.      fi
  14. ;;
  15. *)
  16. echo "Usage: $0 $1 {start}"
  17.         esac
  18. else
  19.      echo "Error service name dismatch"
  20. fi
  21. ;;
  22. *)
  23. echo "Usage: $0 $1 {start}"
  24. exit 1
  25. ;;
  26. esac
  27. exit 0


 
Que c'est laid tu me diras mais ça a le mérite de fonctionner.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Plusieurs daemon dans un même script.

 

Sujets relatifs
Redirection de sortie dans un script....[DEBIAN]script cron.daily qui tourne pas
comment extraire plusieurs tar.gz à la suite ?executer un script bash depuis IE
lancement de plusieurs programmes avec crontabLancement d'un script qui foire
script d'arret et démarrage service sauvegardeScript pour recup info d'une photo
script shell renvoi erreur à l'éxécutionComment arreter un processus, un daemon sous debian (sarge) ?
Plus de sujets relatifs à : Plusieurs daemon dans un même script.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR