Костыль проверяет количество чайлдов апача, если это количество меньше значения директивы MinSpareServers, то прибивает все процессы вебсервера через kill -9, чистит семафоры и стартует апач. Добавить в крон на каждую минуту.
* * * * * /opt/scripts/apache/apache_checker.sh check
# mkdir /opt/scripts/apache
#!/bin/sh ALERTEMAIL="[email protected]" APACHECTL=/usr/sbin/apache2ctl SCRIPT_DIR=/opt/scripts/apache RUNNING_PROCESSES=`ps auxww | grep -c bin/apache`; APACHEUSER="www-data" MinSpareServers="24" ######## [DO NOT MODIFY] ### LOG_FILE=${SCRIPT_DIR}/status.log DATE=`date '+%Y-%m-%d %T'` apache_start() { $APACHECTL start; } apache_stop() { $APACHECTL stop; sleep 1; killall -9 apache httpd apache2 >/dev/null 2>&1; } apache_restart() { apache_stop; sleep 1; apache_semclear; apache_start; } # if not running - start apache_check() { if [[ ${RUNNING_PROCESSES} -le $MinSpareServers ]]; then apache_restart; echo "${DATE} ALERT: `hostname -f` - apache was restarted" >> ${LOG_FILE}; echo "${DATE} ALERT: `hostname -f` - apache was restarted" | /usr/sbin/sendmail $ALERTEMAIL; fi } # clear semaphores apache_semclear() { for i in `ipcs | grep $APACHEUSER | awk -F ' ' '{ print $2}'` do ipcrm -s $i; done } case $1 in start) apache_start; ;; stop) apache_stop; ;; restart) apache_restart; ;; check) apache_check; ;; semclear) apache_semclear; ;; *) echo "Script usage: $0 start | stop | restart | check | semclear"; esac