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