--- support/apachectl.orig 2013-01-15 18:44:25.000000000 +0200 +++ support/apachectl.orig 2013-02-23 17:55:10.000000000 +0200 @@ -54,7 +54,11 @@ HTTPD_NICE=0 # was set to 3, but is redundand if IO scheduler is not cfq ulimit -v $HTTPD_MEM HTTPD="/bin/nice -$HTTPD_NICE $HTTPD" -# + +HTTPD_LOG_DIR="/apache/logs" +HTTPD_PID_FILE="$HTTPD_LOG_DIR/httpd.pid" +HTTPD_MOD_AUTH_DIGEST_PID_BASE="$HTTPD_LOG_DIR/authdigest_shm" + # a command that outputs a formatted text version of the HTML at the # url given on the command line. Designed for lynx, however other # programs may work. @@ -72,6 +76,56 @@ # -------------------- -------------------- # |||||||||||||||||||| END CONFIGURATION SECTION |||||||||||||||||||| + +# Remove Shared Memory Segments by id +cleanup_shm_id() { + ipcs -m -p |grep ^[0-9] |while read shmid owner cpid lpid; do + [ "$cpid" = "$1" ] || continue + echo "Removing stale shmid $shmid for cpid $cpid ..." + ipcrm -m $shmid + done +} + +# Remove all Semaphore Arrays owned by apache +cleanup_sem_ids() { + ipcs -s |grep "[[:space:]]apache[[:space:]]" |while read key semid owner perms nsems; do + echo "Removing stale semid $semid for owner $owner ..." + ipcrm -s $semid + done +} + +cleanup_stale_state_on_startup() { + local HTTPD_PID + local STALE_PIDS + local MAD_PID_PATH + local PID + + # httpd.pid + if [ -f $HTTPD_PID_FILE ]; then + HTTPD_PID=$(cat $HTTPD_PID_FILE) + [ "$(ps -p "$HTTPD_PID" --no-headers -o ucmd)" = "httpd" ] && return + + STALE_PIDS="$HTTPD_PID" + echo "Stale pid $HTTPD_PID - unclean shutdown of previous Apache run?" + rm -v $HTTPD_PID_FILE + cleanup_sem_ids + fi + + # authdigest_shm.* + for MAD_PID_PATH in $(echo ${HTTPD_MOD_AUTH_DIGEST_PID_BASE}.*); do + [ "$MAD_PID_PATH" = "${HTTPD_MOD_AUTH_DIGEST_PID_BASE}.*" ] && return # not found + + echo "Stale $MAD_PID_PATH - unclean shutdown of previous Apache run?" + + STALE_PIDS="$STALE_PIDS ${MAD_PID_PATH##*.}" + rm -v "$MAD_PID_PATH" + done + + for PID in $STALE_PIDS; do + cleanup_shm_id $PID + done +} + # Set the maximum number of file descriptors allowed per child process. if [ "x$ULIMIT_MAX_FILES" != "x" ] ; then $ULIMIT_MAX_FILES @@ -83,7 +137,29 @@ fi case $ACMD in -start|stop|restart|graceful|graceful-stop) +stop) + if [ ! -f "$HTTPD_PID_FILE" ]; then + echo "no httpd pid file" + exit 4 + fi + + HTTPD_PID=$(cat "$HTTPD_PID_FILE") + PS_CMD=$(ps -p "$HTTPD_PID" --no-headers -o ucmd) + + if [ "$PS_CMD" = "" ]; then + echo "httpd (pid $HTTPD_PID?) not running" + exit 4 + fi + + if [ "$PS_CMD" != "httpd" ]; then + echo "process name [$PS_CMD] for pid [$HTTPD_PID] ($HTTPD_PID_FILE) is not httpd" + exit 4 + fi + + kill -TERM $HTTPD_PID || exit 4 + ;; +start|restart|graceful|graceful-stop) + cleanup_stale_state_on_startup $HTTPD -k $ARGV ERROR=$? ;;