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.
Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- 10 Greatest Open Source Software Of 2009
- My 10 UNIX Command Line Mistakes
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- Top 20 OpenSSH Server Best Security Practices
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Linux Video Editor Software
- Download Script
- Email this to a friend
- Rss Feed
- Last Updated: 07/22/08
{ 2 trackbacks }
{ 18 comments… read them below or add one }
A minor change is to be done in the above script,
The “echo $?” statement will give the exit status of the last command. In this case, if httpd is not running, the “pgrep httpd” exit status will be “non zero”.
So, it should be
if [ $? -ne 0 ] #instead of -eq
then
# restart apache
$RESTART
fi
In CentOs 5 You should use /etc/init.d/httpd restart.
Crontab would’t execute service httpd restart
regards
Hubert
Hubert,
Thanks for the heads up. The script has been updated to ‘/sbin/service’ from ’service’.
PGREP httpd returns nothing when httpd is not running, and I think that is causing the check to restart it to fail… Is there any way to test not that it returns 0 but empty or null?
Ben,
A small bug is fixed and script should work now.
—
# find httpd pid
$PGREP ${HTTPD}
if [ $? -ne 0 ] # if apache not running
then
# restart apache
$RESTART
fi
—
can be done in one line..
$PGREP ${HTTPD} || $RESTART
Regards pasci
Pasci many thx , good job, easy
and also thx to NixCraft for this shell script
Nice script, works great.
I just found another good monitoring script posted on this blog: Link
The script tests the webserver’s functionality by downloading a file.
hi all,
i wan to ask, i already run the command ” $ crontab -e ” at the terminal.
so is it i copy the whole sample scripts into the crontab file and then save it?
that all??
for your information im newbie in unix.
Please help. :(
regards
Shuji
@shuji
Follow this:
vi /usr/bin/httpdmonitor
copy the script in to that, after that chmod 777 /usr/bin/httpdmonitor
Now set corntab as:
crontab -e
*/5 * * * * /usr/bin/httpdmonitor >/dev/null 2>&1
This is good script.
Thanks Vivek-
Shrii
Thanks-
./root/monitoringapache.sh: line 5: /sbin/service httpd restart: No such file or directory
pgrep: No matching criteria specified
Usage: pgrep [-flvx] [-d DELIM] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
./root/monitoringapache.sh: line 14: $: command not found
./root/monitoringapache.sh: line 16: [127: command not found
line 14 is
$PGREP $ { HTTPD }
line 16 is
if [ $? -ne 0]
I have this troubles im working on redhat please help me
I make run this script and wen i stop my apache, this $PGREP ${HTTPD}
still geting cero and never restart the apache service, there are another way to see if apache is running?
i’m getting
“[0: command not found"
for the
if [ $? -ne 0 ] # if apache not running
any ideas?
Try ed it for checking deamon of one custom script and works like a charm.Those who says how they get command not found i guess they don’t have command PGREP installed on their OS or they set wrong PATH.
I got a problem, sometimes my httpd stop but the PID still alive, and i need to restart manually the httpd, how can i fix this?? When it happens, i run the httpdmonitor and appears only one PID, so i need to restart apache, then i run the httpdmonitor again, and i can see many PID from apache.
Please help me, i´m needing to restart the apache almost 6 times a day.
Thanks
I saved the script to httpdmonitor.sh and then when it gets called from the script pgrep was not doing a whole word search and returned trued even thought httpd was turned off. This is on an older redhat system. change pgrep to be ‘pgrep -l -x’. Now it appears to work well and ignores httpdmonitor.sh
FYI for anyone else who runs into this snag.
Regards
I put this script to github so everybody may clone and change it.
http://github.com/andreashe/keepapacherunning
Tell me if this is not ok and I will remove it.
Maybe someone want to build in some autodetections for differences in distries.
It is a GPLed script, so I don’t see any problem as long as anyone follows GPL.