Plusieurs daemon dans un même script.

Plusieurs daemon dans un même script. - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 31-07-2006 à 08:47:53    

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.

Reply

Marsh Posté le 31-07-2006 à 08:47:53   

Reply

Marsh Posté le 31-07-2006 à 09:08:15    

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
Reply

Marsh Posté le 31-07-2006 à 09:24:32    

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:  

Reply

Marsh Posté le 31-07-2006 à 09:34:26    


[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
Reply

Marsh Posté le 31-07-2006 à 10:45:30    

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
Reply

Marsh Posté le 31-07-2006 à 11:28:21    

tu peux imbriquer les cases ;)


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 31-07-2006 à 12:38:45    

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
Reply

Marsh Posté le 31-07-2006 à 13:41:09    

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
Reply

Marsh Posté le 31-07-2006 à 14:42:16    

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
Reply

Marsh Posté le 31-07-2006 à 14:44:06    

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
Reply

Marsh Posté le 31-07-2006 à 14:44:06   

Reply

Marsh Posté le 31-07-2006 à 14:57:58    

source mon_fichier [:spamafote]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 31-07-2006 à 15:25:09    

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

Reply

Marsh Posté le 31-07-2006 à 18:02:02    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed