cron job to start a service?

Hello, I am looking for a cron job script that can run every 1 minute to check if  a service is running on my linux box. If the service is running the script does nothing but if the service is not running the script should activate another script to start the service? Can someone help me with this? Thank you.
aej1973Asked:
Who is Participating?
 
skullnobrainsConnect With a Mentor Commented:
ps -p `cat /var/run/myservice.pid` >/dev/null || /etc/rc.d/service_name start

you'll get an email everytime the service is started

if you're using an os where services provide status commands, you can use that instead of looking for a pid. on linux, you usually do not have status, but your rc scripts use startstopcmd that can be queried for the status

---

if you're not really monitoring a service an want a pseudo-daemon, try this

flock -w 60 /var/run/mylock.lock -c "YOUR COMMAND HERE"

this command will restart the process as soon as it dies at most once per minute. if you want it to work more than once per minute, you can use more than 60 for the wait time

---

or a combination

flock -w 60 /tmp/mylock.lock -c "while sleep 0.1 ; do ! ps -p 11565 >/dev/null && echo restarting myservice && RESTART COMMAND && break ; done"

this will restart the given process at most once per minute, send a warning email when it does. make sure whatever script you use does not provide output when it does not restart anything or cron will have to store that output
0
 
ThomasMcA2Commented:
My first suggestion is to fix whatever is causing your service to stop running. Services are designed to be running all the time. Instead of merely restarting the service, it would be better to fix the underlying problem.

However, the following script answers your question:

if [ "`/bin/ps -ef | grep "your_script_name" | grep -v "grep"`" = "" ]; then
  echo NOT Running!
fi

Since cron jobs are 1-liners, change each statement line to end with a semicolon, and remove the hard returns to get this cron entry:

if [ "`/bin/ps -ef | grep "your_script_name" | grep -v "grep"`" = "" ]; then  echo NOT Running!; fi

Obviously, you will need to change your_script_name and replace the echo statement with the command to start services for your distro (the command is different for different distros.)
0
 
TintinCommented:
You should look into defining an /etc/inittab entry for the service.
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
aej1973Author Commented:
Tintin, how do I do that?
0
 
TintinCommented:
Assuming /etc/inittab exists on your system (not installed by default on some Linux distros), add an entry like:


zz:3:respawn:/path/to/service

Where:

zz is a 2 character reference (you can make this anything unique)
3 is the run level the entry is valid for
respawn means restart the command if it dies



Running

init q

will force the init process to reexamine /etc/initab to pick up the new entry.

Note that using this process won't give you any control as to manually stopping/starting the daemon, which may, or may not be important to you.
0
 
omarfaridConnect With a Mentor Commented:
the solution given by tintin is good but if /path/to/service is a script that run another process and exit then it may not work.

what you could do is:

- run the monitoring script as an inittab entry as given by tintin, and let the script loop:

while true
do
   grep processname | grep -v grep
   if [ $? -ne 0 ]
   then
       put your command to restart the process
   fi
   sleep 60
one
0
 
aej1973Author Commented:
skullnobrains, so if I run this cron job every 5 minutes this is how it is going to look?

*/5 * * * * ps -p `cat /var/run/myservice.pid` >/dev/null || /etc/rc.d/service_name start


Thank you,
A
0
 
aej1973Author Commented:
Also, how do I check to make sure my cron is running every 5  mins?
0
 
skullnobrainsCommented:
yes it would look like this.
check that the path is set properly or use the complet path to ps (likely /bin/ps)

if cron runs, it will run.

you can stop the sevice and wait. pretty much tests the whole thing.

cron should also send you a mail when there is output, so you'll receive a mail each time with the output (ie when it does restart the service). you can remove the redirection into /dev/null if you want a mail every time

you can also add some logging to it. try something like this

*/5 * * * * date >>/var/log/myservice.mon.log ; ps -p `cat /var/run/myservice.pid` >>/var/log/myservice.mon.log || /etc/rc.d/service_name start 2>&1 >>/var/log/myservice.mon.log

if your monitoring script becomes too complicated to be a one-liner, you had better stick it in a file and run the file from cron
0
 
aej1973Author Commented:
Thank you.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.