Shell Script To Auto Restart Apache HTTPD When it Goes Down / Dead

by on May 16, 2008 · 27 comments

Here is a simple shell script tested on CentOS / RHEL / Fedora / Debian / Ubuntu Linux. Should work under any other UNIX liker operating system. It will check for httpd pid using pgrep command

pgrep command

pgrep looks through the currently running processes and lists the process IDs which matches the selection criteria to screen. If no process found it will simply return exit status 0 (zero).

Download the script and set cronjob as follows:
*/5 * * * * /path/to/script.sh >/dev/null 2>&1

Sample script

#!/bin/bash
# Apache Process Monitor
# Restart Apache Web Server When It Goes Down
# -------------------------------------------------------------------------
# Copyright (c) 2003 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
# RHEL / CentOS / Fedora Linux restart command
RESTART="/sbin/service httpd restart"
 
# uncomment if you are using Debian / Ubuntu Linux
#RESTART="/etc/init.d/apache2 restart"
 
#path to pgrep command
PGREP="/usr/bin/pgrep"
 
# Httpd daemon name,
# Under RHEL/CentOS/Fedora it is httpd
# Under Debian 4.x it is apache2
HTTPD="httpd"
 
# find httpd pid
$PGREP ${HTTPD}
 
if [ $? -ne 0 ] # if apache not running
then
 # restart apache
 $RESTART
fi

A better and more reliable solution is monit monitoring software for restarting services such as mysql, apache and sendmail under UNIX / Linux operating systems.

4000+ howtos and counting! If you enjoyed this article, join 45000+ others and get free email updates!

{ 25 comments… read them below or add one }

21 John March 13, 2011

If adapting this for other processes add an -x flag to force pgrep to match the process name exactly

$PGREP ${HTTPD}

The name of my script contains the name of the the process to pgrep was giving a false positive when the process wasn’t running.

22 Anonymous October 3, 2011

what bug was fixed? is the orginal source updated?

23 Phillip October 3, 2011

Had to use PGREP=”/usr/bin/pgrep -l -x” to get it to work on CentOs (5.4)

24 francois April 13, 2012

I am not a big fan of greping httpd in process list to see if httpd server is running or not. There can be several httpd services installed. Two options are either the status module, or this bash script to the extent that you known the full path to your httpd bin folder:

function isapup(){
pid=$($1/bin/apachectl -S | grep PidFile | awk ‘{print $2}’) # retrieve the expected path of the process id file
pid=${pid:1:`expr ${#pid} – 2`} # get rid of the quotes
up=$(ls $pid 2> /dev/null) # see if process id file exists

if [ ! "$up" ]
then
return 1
fi
}

isapup /opt/httpd/2.4.0

if [ $? -eq 1 ] # if isapup returned 1
then
echo Starting Apache
/opt/httpd/2.4.0/bin/apachectl start
fi

25 Wolfsrudel May 4, 2012

Why won’t you just use ‘monit’?

Leave a Comment

You can use these HTML tags and attributes for UNIX commands or shell scripts: <strong> <em> <ol> <li> <u> <ul> <blockquote> <pre> <a href="" title="">
What is 8 + 7 ?
Please leave these two fields as-is:
Are you a human being? Solve the simple math so we know that you are a human and not a script.



Tagged as: apache httpd, apache web server, eq, exit status, grep command, linux, running processes, shell script, unix, Web Server

Previous Script:

Next Script: