Marc Reichelt: Problem halb gelöst, aber weiteres Problem entdeckt

Beitrag lesen

Hallo nochmals,

ich habe mir nun eine halbwegs vernünftige Lösung erstellt: Ein Shell-Skript, welches zuerst alle PIDs der "apache2"-Prozesse des Benutzers "www-data" sichert, dann einen Server-Neustart initialisiert und anschließend jede Sekunde überprüft, ob die Prozesse mit den PIDs noch existieren (denn die neuen Prozesse haben immer eine höhere PID).
Anschließend werden trotzdem noch 30 Sekunden Sicherheitspause eingelegt, da die beiden Zeilen "apache2pids=pgrep -U www-data apache2" zusammen mit "apache2ctl -k graceful" keine atomare Operation (EN) darstellen.
In Ausnahmefällen könnte nämlich genau in der Mitte der beiden Operationen ein neuer Prozess gestartet werden, dessen PID nicht in der Variable $apache2ctl zu finden ist und der ergo auch nicht überprüft wird.

Gibt es eine Möglichkeit, diese kleine Ungereimtheit auch noch zu entfernen? Wenn ihr mir dabei helft haben wir nachher eine schöne Lösung gefunden, wie man einen Apache2-Server "nett" neustarten kann und trotzdem weiß wann er neu gestartet ist. :-)

Hier das Skript, wie ich es derzeit verwende:

#!/bin/bash  
  
function someProcessesLeft () {  
  for pid in $@  
  do  
    if $(ps -p $pid > /dev/null)  
    then  
      return 0  
    fi  
  done  
  
  return 1  
}  
  
# -----------------------------------------------------------------------  
echo "DO SOMETHING HERE (before Apache2 restart)"  
# -----------------------------------------------------------------------  
  
# Save processes and init restart  
apache2pids=`pgrep -U www-data apache2`  
apache2ctl -k graceful  
while someProcessesLeft $apache2pids  
do  
  sleep 1  
  echo -n "."  
done  
  
echo  
echo "Waiting for 30 seconds to ensure the restart was successfully..."  
sleep 30  
  
# -----------------------------------------------------------------------  
echo "DO SOMETHING HERE (after Apache2 restart)"  
# -----------------------------------------------------------------------

Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
DPRINTK("Last time you were disconnected, how about now?");
        linux-2.6.6/drivers/net/tokenring/ibmtr.c
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)