logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 15-03-2012 19:04:58

isma
Membre
Inscription : 15-03-2012

[Résolu] Problème de script de démarrage pour Squid

Bonjour,

j'ai installé Squid sur Debian 6 d'après les sources et j'ai crée un petit script de démarrage
et d'extinction .
Ce script fonctionne quand je le lance à la main, je peux vérifier dans les logs de Squid que ça s'est bien passé, surtout au redémarrage ( rebuilding storage ..(CLEAN) ) .
Mais après un update-rc.d squid defaults , quand j'éteins le PC, Squid doit être coupé brusquememnt puisqu'au redémarrage , les logs indique DIRTY à la place de CLEAN .

Je pense que c'est le test avant l'extinction qui n'est pas respecté ou respectable (?) .
Voilà le script , je vous remercie de votre aide :

#!/bin/bash
### BEGIN INIT INFO
# Provides: proxy
# Required-Start: $named
# Required-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Demarre Squid
# Description: Eteins Squid
### END INIT INFO

case "$1" in
'start')
    /usr/sbin/squid   
    ;;
'stop')
    /usr/sbin/squid -k shutdown
            n=120
            while /usr/sbin/squid -k check && [ $n -gt 120 ]; do
                sleep 1
                echo -n .
                n=`expr $n - 1`
            done
    ;;
*)
    echo "Usage: $0 { start | stop }"
    ;;
esac
exit

Dernière modification par isma (19-03-2012 17:41:02)

Hors ligne

#2 15-03-2012 23:03:10

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Résolu] Problème de script de démarrage pour Squid

Yep!

Ton script n'est déjà pas trés clair !!!

Tu déclares une variable n = 120 et ensuite tu la décrementes de 1 en comparant cette même variable à 120. La boucle ne s'executera qu'une seule fois.

120 -gt 120 (-gt = plus grand que)
120-1 = 119
119 -gt 120
fin de boucle.

Ton script ne s'execute qu'une seule fois et je ne pense pas que ce soit voulu hmm

Ensuite,

while /usr/sbin/squid -k check && [ $n -gt 120 ]


Le && (et) ne te garantit pas que le script va attendre que les deux conditions soient remplies. C'est un ET qui passe la main.
Dés que l'une d'elle est terminé, on sort de la boucle. Ce sont deux conditions distinctes.
C'est à mon avis ici que se posent le problème.
Tu executes bien la commande squid (/usr/sbin/squid -k shutdown et -k check) et en même temps la comparaison (le fameux &&). Si la comparaison de n se termine avant la commande  d'extinction de squid, tu sorts de la boucle et casse ainsi toute autre condition, la boucle est rompue, le contrôle du processus est incertain.

La meilleur solution serait d'attendre que le processus se termine si cela est le but.

/usr/sbin/squid -k shutdown &
while [ $(pgrep "squid") != "" ];do
     sleep 5
done


Tant que le processus existe on boucle et patiente 5 secondes.


Si tu veux utiliser un compteur pour killer le processus à coup sur :

n=10

/usr/sbin/squid -k shutdown &

while [ $n -gt 0 ];
 do
   echo "$n"
   n=$(( $n - 1 ))
   sleep 1
done


On kill squid et on attend 10 secondes.

Tu peux aussi utiliser des conditions avec if else à l'interieure d'une boucle. Ainsi, c'est toi qui décide quand on sort de la boucle :

while true;
do
   if (quelquechose); then
      break
   else
      sleep 5
   fi
done


@+

Zoroastre.

Dernière modification par zoroastre74 (15-03-2012 23:37:33)

Hors ligne

#3 16-03-2012 16:01:22

isma
Membre
Inscription : 15-03-2012

Re : [Résolu] Problème de script de démarrage pour Squid

Merci pour ta réponse rapide .
Je pensais que c'était bon mais après maints essais durant une partie de la matinée, je n'arrive pas à ce que je voudrais .
Si Squid est éteint j'aimerais que le script se finisse mais si je ne mets pas de compteur il ne s'arrête pas et si j'en mets un il va jusqu'au bout du compteur .

Pourtant un pgrep -o "squid" me renvoit rien idem pour cat /var/run/squid.pid .

Quand je teste ce script avec /bin/bash -x -v ./squid stop . Il sort normalement, enfin je crois :

50
+ n=49
+ sleep 1
+ '[' -e /var/run/squid.pid ']'
+ '[' 49 -gt 1 ']'
+ echo 48
+ n=48
+ sleep 1
+ '[' -e /var/run/squid.pid ']'
exit
+exit


Voilà le script, je sais pas si c'est un problème de syntaxe ou bien de logique :

#!/bin/bash
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $named
# Required-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Démarre Squid
# Description: Charge la config
### END INIT INFO
#!/bin/bash
# SQUID

case "$1" in
start)
  /usr/sbin/squid  
  echo "lancement de Squid"
  sleep 1
  ;;
stop)
  n=80
  /usr/sbin/squid -k shutdown &
    while [ -e /var/run/squid.pid ];
      do
        if [ $n -gt 1 ];then
          echo "$n"
          n=$(( $n - 1 ))
          sleep 1;
          else
          break;
          fi;
            done
  ;;
*)
  echo "Usage {Start|Stop}"
  ;;
esac
exit


Je te remercie encore de ton aide pour mes premiers pas dans le bash !

Hors ligne

#4 16-03-2012 16:02:38

isma
Membre
Inscription : 15-03-2012

Re : [Résolu] Problème de script de démarrage pour Squid

Merci pour ta réponse rapide .
Je pensais que c'était bon mais après maints essais durant une partie de la matinée, je n'arrive pas à ce que je voudrais .
Si Squid est éteint j'aimerais que le script se finisse mais si je ne mets pas de compteur il ne s'arrête pas et si j'en mets un il va jusqu'au bout du compteur .

Pourtant un pgrep -o "squid" me renvoit rien idem pour cat /var/run/squid.pid .

Quand je teste ce script avec /bin/bash -x -v ./squid stop . Il sort normalement, enfin je crois :

50
+ n=49
+ sleep 1
+ '[' -e /var/run/squid.pid ']'
+ '[' 49 -gt 1 ']'
+ echo 49
49
+ n=48
+ sleep 1
+ '[' -e /var/run/squid.pid ']'
exit
+exit


Voilà le script, je sais pas si c'est un problème de syntaxe ou bien de logique :

#!/bin/bash
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $named
# Required-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Démarre Squid
# Description: Charge la config
### END INIT INFO
#!/bin/bash
# SQUID

case "$1" in
start)
  /usr/sbin/squid  
  echo "lancement de Squid"
  sleep 1
  ;;
stop)
  n=80
  /usr/sbin/squid -k shutdown &
    while [ -e /var/run/squid.pid ];
      do
        if [ $n -gt 1 ];then
          echo "$n"
          n=$(( $n - 1 ))
          sleep 1;
          else
          break;
          fi;
            done
  ;;
*)
  echo "Usage {Start|Stop}"
  ;;
esac
exit


Je te remercie encore de ton aide pour mes premiers pas dans le bash !

Hors ligne

#5 16-03-2012 18:25:36

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Résolu] Problème de script de démarrage pour Squid

Yep!

Pourquoi utiliser pgrep -o "squid" ???

l'option -o t'empêche de voir tous les pid liés au processus...Si tu veux arrêter un processus, ben il faut arrêter tous les processus, parents et enfants compris.

Je pense que ton problème peut être résolu facilement :

/usr/sbin/squid -k shutdown &


Le & rend la main au script. Si il faut une certaine latence pour que squid se clos, il ne faut rendre la main qu'au moment où squid est bien arrêté.
Tout simplement :

/usr/sbin/squid -k shutdown


On peut également informer les logs de l'etat de squid au moment de l'arrêt machine.
Je ferais un truc dans ce genre si tu tiens à ton & tongue :

n=1
while true; do
if [ $(pgrep "squid") != "" ]; then
echo "squid messenger - shutdown procedure $n"
/usr/sbin/squid -k shutdown &
n=$(($n + 1))
else if [ $n -eq 5 ]; then
echo "squid messenger - error, unstopped"
break
else
echo "squid messenger - no processus detected"
break
fi
sleep 2
done


A tester, c'est écrit rapidos.
Je précise que je ne connais pas du tout squid dans la pratique.

@+

Zoroastre.

Dernière modification par zoroastre74 (16-03-2012 18:31:11)

Hors ligne

#6 19-03-2012 17:17:58

isma
Membre
Inscription : 15-03-2012

Re : [Résolu] Problème de script de démarrage pour Squid

Alors !

L'option -o pour pgrep , je l'ai mise sinon le script me renvoyer une erreur car il y a plusieurs processus et c'est pas comprable avec "" .

Après plusieurs echecs, je me suis dis d'aller voir ce qui était prosposé avec apt .

Voilà le script ( un peu plus long mais efficace ) :

#! /bin/sh
#
# squid   Startup script for the SQUID HTTP proxy-cache.
#
# Version:  @(#)squid.rc  2.20  01-Oct-2001  miquels@cistron.nl
#
### BEGIN INIT INFO
# Provides:          squid
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Squid HTTP Proxy
### END INIT INFO

NAME=squid
DAEMON=/usr/sbin/squid
LIB=/usr/lib/squid
PIDFILE=/var/run/$NAME.pid
SQUID_ARGS="-D -YC"

[ ! -f /etc/default/squid ] || . /etc/default/squid

. /lib/lsb/init-functions

PATH=/bin:/usr/bin:/sbin:/usr/sbin

[ -x $DAEMON ] || exit 0

grepconf () {
  w="   " # space tab
  sq=/etc/squid/squid.conf
  # sed is cool.
  res=`sed -ne '
    s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
    t end;
    d;
    :end q' < $sq`
  [ -n "$res" ] || res=$2
  echo "$res"
}

grepconf2 () {
  w="   " # space tab
  sq=/etc/squid/$NAME.conf
  # sed is cool.
  res=`sed -ne '
    s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
    t end;
    d;
    :end q' < $sq`
  [ -n "$res" ] || res=$2
  echo "$res"
}

#
# Try to increase the # of filedescriptors we can open.
#
maxfds () {
  [ -n "$SQUID_MAXFD" ] || return
  [ -f /proc/sys/fs/file-max ] || return 0
  global_file_max=`cat /proc/sys/fs/file-max`
  minimal_file_max=$(($SQUID_MAXFD + 4096))
  if [ "$global_file_max" -lt $minimal_file_max ]
  then
    echo $minimal_file_max > /proc/sys/fs/file-max
  fi
  ulimit -n $SQUID_MAXFD
}

start () {
  cdr=`grepconf2 cache_dir /var/spool/$NAME`
  ctp=`grepconf cache_dir ufs`

  case "$cdr" in
    [0-9]*)
      log_failure_msg "squid: squid.conf contains 2.2.5 syntax - not starting!"
      log_end_msg 1
      exit 1
      ;;
  esac
 
  #
    # Create spool dirs if they don't exist.
    #
  if [ -d "$cdr" -a ! -d "$cdr/00" ] || [ "$ctp" = "coss" -a ! -w "$cdr" ]
  then
    log_warning_msg "Creating squid cache structure"
    $DAEMON $SQUID_ARGS -z
  fi

  if [ "$CHUID" = "" ]; then
    CHUID=root
  fi

  maxfds
  umask 027
  start-stop-daemon --quiet --start \
    --pidfile $PIDFILE \
    --chuid $CHUID \
    --exec $DAEMON -- $SQUID_ARGS < /dev/null
  return $?
}

stop () {
  PID=`cat $PIDFILE 2>/dev/null`
  start-stop-daemon --stop --quiet --pidfile $PIDFILE --name squid
  #
  # Now we have to wait until squid has _really_ stopped.
  #
  sleep 2
  if test -n "$PID" && kill -0 $PID 2>/dev/null
  then
    log_action_begin_msg " Waiting"
    cnt=0
    while kill -0 $PID 2>/dev/null
    do
      cnt=`expr $cnt + 1`
      if [ $cnt -gt 24 ]
      then
        log_action_end_msg 1
        return 1
      fi
      sleep 5
      log_action_cont_msg ""
    done
    log_action_end_msg 0
    return 0
  else
    return 0
  fi
}

case "$1" in
    start)
  log_daemon_msg "Starting Squid HTTP proxy" "squid"
  if start ; then
    log_end_msg $?
  else
    log_end_msg $?
  fi
  ;;
    stop)
  log_daemon_msg "Stopping Squid HTTP proxy" "squid"
  if stop ; then
    log_end_msg $?
  else
    log_end_msg $?
  fi
  ;;
    reload|force-reload)
  log_action_msg "Reloading Squid configuration files"
  $DAEMON -k reconfigure
  log_action_end_msg 0
  ;;
    restart)
  log_daemon_msg "Restarting Squid HTTP proxy" "squid"
  stop
  if start ; then
    log_end_msg $?
  else
    log_end_msg $?
  fi
  ;;
    status)
  status_of_proc -p "$PIDFILE" "$DAEMON" squid && exit 0 || exit $?
  ;;
    *)
  echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart|status}"
  exit 3
  ;;
esac

exit 0


J'ai un peu de mal avec le sed et la fonction grepconf . Je ne comprends pas l'usage .

Enfin voilà la fin de l'histoire . Prochain script : changer automatiquement les règles de routage si Squid chute .
Merci pour l'aide
A+

Hors ligne

#7 19-03-2012 17:22:49

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : [Résolu] Problème de script de démarrage pour Squid

Ah super isma et merci du retour !

Si c'est [Résolu] tu peux l'ajouter au titre du premier post, voir le tuto là :
http://debian-facile.org/atelier:resolu Hop !

Amitié, Joel wink

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#8 19-03-2012 20:48:44

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Résolu] Problème de script de démarrage pour Squid

Yep!

isma a écrit :

J'ai un peu de mal avec le sed et la fonction grepconf . Je ne comprends pas l'usage


sed permet de faire du hashage de data. Cela permet par exemple d'isoler des informations essentielles entre des metatags définis par l'utilisateur. C'est trés pratique sur des fichiers html, rss ou de config dans le cas présent, en effet, ces fichiers contiennent des caractères qui auraient pûs être interprétés comme des redirections ("><|") ou comme des fins de lignes (";/&") par le shell.
sed est trés puissant pour cette utilisation. Il y a d'ailleurs beaucoup d'humour dans le nom de la fonction grepconf() lol

Lorsque j'utilise sed, j'ai toujours le man à dispo tongue

Les fonctions grepconf() et grepconf2() prennent 2 paramètres en entrée :

cdr=`grepconf2 cache_dir /var/spool/$NAME`
ctp=`grepconf cache_dir ufs`


Le premier paramètre est la valeur recherchée : cache_dir dans la variable sq
Le second paramètre est comparé au résultat du sed et permet de savoir si le cache existe ou pas lors de la phase de démarrage (fonction start())

@+

Zoroastre.

Hors ligne

#9 21-03-2012 09:37:39

isma
Membre
Inscription : 15-03-2012

Re : [Résolu] Problème de script de démarrage pour Squid

Bé merci encore ZoroAstre pour tes éclaircissements .

@+

Hors ligne

Pied de page des forums