Problème arrêt/relance apache2

Bonjour,

Je me permets de faire appel à votre aide concernant un problème récurrent rencontré depuis 2 semaines sur un de mes serveurs dédiés à propos de l’arrêt automatique d’apache et de sa relance .

Tout d’abord mon environnement :

Debian etch Linux 2.6.24.2
Tous les matins vers 6h25 un backup mysql est réalisé sur ce serveur. Pour se faire apache2 est “normalement” arrêté le temps du backup puis relancé.

Jusqu’à il y a 2 semaines tout fonctionner parfaitement mais pour une raison encore non indentifiée, apache ne s’arrête plus totalement puisqu’il reste toujours un process “fantome” qui empêche la relance complète d’apache :

Voici la log du backup qui montre mieux l’erreur :

Stopping web server (apache2)…
Starting web server (apache2)…(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
failed!

En se connectant sur le serveur on voit bien qu’il reste un process :

[root@ds0244:~]#ps -ef|grep apache
www-data 17722 1 0 Apr12 ? 00:10:15 /usr/sbin/apache2 -k start
root 27433 27418 0 09:56 pts/0 00:00:00 grep --color=always apache

Seul moyen de relancer correctement apache (car malgrès la présence de ce process on ne peut plus joindre les sites hébergés sur ce serveur), killer ce processus puis relancer apache.

Le problème étant qu’en attendant de trouver pourquoi apache ne s’arrête pas complètement je dois trouver un moyen de forcer le kill du processus restant actif car pour le moment j’en suis à devoir me lever exprès le matin pour effectuer cette opération.

Pour forcer le kill de ce processus récalcitrant le script suivant (sous le nom “zapache”) a été ajouté dans le cron.daily :

#!/bin/sh

killall -9 apache2
/etc/init.d/apache2 start

Malheureusement force est de constater que ça ne fonctionne pas comme le montre la suite de la log :

/etc/cron.daily/zapache:
apache2: no process killed
Starting web server (apache2)…(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
failed!
run-parts: /etc/cron.daily/zapache exited with return code 1

Mon problème est donc double désormais :

1- Trouver ce qui a pu changer il y a 2 semaines sur le serveur et qui empêche l’arrêt complet d’apache
2- En attendant de régler le point 1 trouver un moyen temporaire de killer complètement apache afin qu’il se relance correctement et que je ne sois pas obligé de me lever tous les matins à 6h30 pour effectuer manuellement cette opération.

On m’a proposé le script suivant pour killer totalement apache :

#!/bin/sh

ps -aux | grep apache > apacheRestart.log # On liste les process apache et on les enregistre dans apacheRestart.log
sed -i ‘2d’ apacheRestart.log # Suppression de la deuxième ligne du “ps” qui correspond au grep.
sed -i ‘s/www-data //g’ apacheRestart.log # Suppression des caractères inutiles
sed -i ‘s/1 0 Apr05 ? 00:10:40 /usr/sbin/apache2 -k start//g’ apacheRestart.log # idem
kill -9 “$(cat apacheRestart.log)” # On kill…

Mais le problème de ce script réside dans l’avant dernière ligne qui repose sur des informations variables chaque jour.

Est-ce qu’il est possible de remplacer éventuellement :

sed -i ‘s/1 0 Apr05 ? 00:10:40 /usr/sbin/apache2 -k start//g’ apacheRestart.log

par

sed -i ‘s/1 0 * * /usr/sbin/apache2 -k start//g’ apacheRestart.log

Alors ça pourrait peut-être le faire mais je ne sais pas si ça sera fonctionnel au final ?
Peut-être avez-vous une idée plus certaine sur la manière d’arrêter totalement apache ou mieux d’identifier ce qui empêche celui-ci de s’arrêter totalement ?

Merci d’avance de votre aide.

Je sais que ma réponse ne va pas t’avancer sur le problème spécifique de tes processus fantômes, mais pourquoi ne fais tu pas un “hot” backup? Par exemple mysqldump avec l’option --loc-tables (pour les tables MyIsam). Ou bien utilise le script Perl fourni avec MySql mysqlhotcopy dev.mysql.com/doc/refman/5.0/en/ … tcopy.html

Edit:
Pour ton script “killer”:

[code]#!/bin/bash

for pid in $(ps -u www-data -o pid=); do
# ici tu mets ta commande kill
echo "killing $pid"
done
[/code]

Ou, plus radical car il tuera tous les processus apache2, y compris celui de root: