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

Beitrag lesen

Hallo Edgar,

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).

tut nichts zur Sache, also nur nebenbei: Diese Annahme ist falsch. Sind N Prozesse erzeugt worden, fährt das OS mit einer niedrigen Nummerierung fort.

Logischerweise. Aber dies ist im betrachteten Zeitraum sehr unwahrscheinlich.

[...]
Gibt es eine Möglichkeit, diese kleine Ungereimtheit auch noch zu entfernen?

Nein und es ist auch nicht hundertprozentig gesichert, daß während pgrep arbeitet, nicht keine Prozesse erzeugt werden.

Ich weiß - daher ja der Timeout.
Man müsste ein Apache-Modul schreiben, dass diese Funktionalität zur Verfügung stellt - dann wäre es möglich.
Trotzdem funktioniert mein Backup-Skript für Logfiles sehr gut (da die betrachteten Fälle sehr unwahrscheinlich sind), und daher stelle ich es hier jedem, der es brauchen kann, hiermit zur Verfügung:

#!/bin/bash  
  
# Options  
target="/var/www"  
safewaittime=30  
  
  
  
function someProcessesLeft () {  
  for pid in $@  
  do  
    if $(ps -p $pid > /dev/null)  
    then  
      return 0  
    fi  
  done  
  
  return 1  
}  
  
if test `whoami` != "root"; then  
  echo "Error: Must be root to run this script."  
  exit 1  
fi  
  
cd $target  
echo "Moving log files"  
  
for dir in *; do  
  if `test -d "$dir"`; then  
    if `test -d "$dir"/logs`; then  
      if `test -f "$dir"/logs/access_log`; then  
        mv "$dir"/logs/access_log "$dir"/logs/access_log.temp  
      fi  
      if `test -f "$dir"/logs/error_log`; then  
        mv "$dir"/logs/error_log "$dir"/logs/error_log.temp  
      fi  
    fi  
  fi  
done  
  
  
  
echo "Giving Apache2 the order to restart"  
  
# Save processes and init restart  
apache2pids=`pgrep -U www-data apache2`  
apache2ctl -k graceful  
  
echo "Waiting for Apache2 to restart..."  
  
while someProcessesLeft $apache2pids  
do  
  sleep 5  
  echo -n "."  
done  
  
echo  
echo "Waiting $safewaittime more seconds to ensure the restart is fulfilled..."  
sleep $safewaittime  
  
  
  
for dir in *; do  
  if `test -d "$dir"`; then  
    if `test -d "$dir"/logs`; then  
      echo "Compressing log files for \"$dir\"";  
  
      if `test -f "$dir"/logs/access_log.temp`; then  
        nice gzip -c "$dir"/logs/access_log.temp >> "$dir"/logs/access_log.old.gz;  
        rm "$dir"/logs/access_log.temp;  
      fi  
  
  
      if `test -f "$dir"/logs/error_log.temp`; then  
        nice gzip -c "$dir"/logs/error_log.temp >> "$dir"/logs/error_log.old.gz;  
        rm "$dir"/logs/error_log.temp;  
      fi  
    fi  
  fi  
done

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:)