11

I have this script, I am using it to setup CRON job to execute this script, so it can check if MySQL service is running; if not then it restart the MySQL service:

#!/bin/bash
service mysql status| grep 'mysql start/running' > /dev/null 2>&1
if [ $? != 0 ]
then
    sudo service mysql restart
fi

I have setup cron job as.

sudo crontab -e

and then added,

*/1 * * * * /home/ubuntu/mysql-check.sh

Problem is that it restart MySQL on every cron job execution.. even if server is running it restart the MySQL service what is correction in the script to do that.

  • why do you have a `\` in front of your shebang? If it's there to keep it from looking like a comment, then it's unnecessary. Shebangs are treated special like by Bash, as in they don't need to be escaped because they aren't comments in the sense that a comment is a piece of code that is not evaluated at all. – Alexej Magura Apr 21 '14 at 6:37
  • 1
    Also, avoid using [ ... ] or test <TEST> in Bash. They're deprecated syntax. Use [[ ... ]] instead. Only use [ ... ] and/or test <TEST> when [[ ... ]] is not available. – Alexej Magura Apr 21 '14 at 6:43
  • 1
    this is first shell script I tried by using some available scripts, I just modified it. don't know much about syntax. problem is still there mysql restarts on every CRON job execution @AlexejMagura – Straw Hat Apr 21 '14 at 7:09
  • 1
    Try something like this: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi What this does, is it starts up a subshell, wherein service mysql status | grep 'mysql start/running' &> /dev/null gets run, the return (exit) status of said subshell then gets passed to the if-statement, which then checks to see if it is non-zero, and if it is not non-zero then it runs the then block. – Alexej Magura Apr 21 '14 at 7:17
  • Doesn't mysql write its process pid to pid file? If it does you could use that as another way to check your mysql status – Flint Apr 21 '14 at 7:57
15

I suspect that you setup the cron job to execute this script in your crontab file, and not in the root crontab file. This is not correct because if you don't run service mysql status as root, the mysql service will not be recognized.

So, modify the script as follow:

#!/bin/bash
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
then
    /usr/sbin/service mysql start
fi

Be sure that is executable:

chmod +x /path/to/script

Then add a new entry in the root crontab as follow:

  • Edit root crontab file using:

    sudo crontab -e
    
  • And add the following line to the file:

    */1 * * * * /path/to/script
    
  • Note: I have set the cron job for every minute, but you can change as you wish or as you think is better. See http://en.wikipedia.org/wiki/Cron in this sense.

  • I setup it as crontab, I guess problem is with the script, i'll try above script – Straw Hat Apr 21 '14 at 7:45
  • ./mysql-check.sh: line 2: [: =~: binary operator expected error in above script – Straw Hat Apr 21 '14 at 7:48
  • I believe you want to negate that regex matching with ! if you actually intend to restart the mysql service on crash – Flint Apr 21 '14 at 8:01
  • @Flint That's true also... Sorry, I'm still drinking my morning coffee. :) – Radu Rădeanu Apr 21 '14 at 8:03
  • @D_Vaibhavツ Now should be everything OK. So, try now, as root. – Radu Rădeanu Apr 21 '14 at 8:06
3

Radu's answer nearly worked. I had to set the path to make it work:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
  • 1
    In fact I have set my PATH in the crontab file. Anyway, in your case you need to use PATH=/usr/sbin:$PATH or use the full path for service as I edited my answer. – Radu Rădeanu Aug 22 '14 at 17:15
1

Radu's answer works - but this script works as well

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
  • I checked the pgrep mysql and I got 0 for mysql being stopped and 2 for running. Therefor I set the condition asif [[ $(pgrep mysql | wc -l) = 0 ]]; and it worked for me. – Alin C Feb 11 '18 at 18:18
  • probably better your way... I'll make the change. – JxAxMxIxN Feb 15 '18 at 21:48

protected by Community Aug 21 '18 at 23:03

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.