Skip to content

Instantly share code, notes, and snippets.

@mheadd
Created May 13, 2013 20:00
Show Gist options
  • Star 53 You must be signed in to star a gist
  • Fork 21 You must be signed in to fork a gist
  • Save mheadd/5571023 to your computer and use it in GitHub Desktop.
Save mheadd/5571023 to your computer and use it in GitHub Desktop.
Simple bash script to check whether MySQL is running.
#!/bin/bash
UP=$(pgrep mysql | wc -l);
if [ "$UP" -ne 1 ];
then
echo "MySQL is down.";
sudo service mysql start
else
echo "All is well.";
fi
@ottomatias
Copy link

I don't know which distro are you using but to me it seems a better version is:

UP=$(pgrep mysql | wc -l);
if ["$UP" -eq 0];
then
echo "MySQL is down.";
sudo service mysql start

else
echo "All is well.";
fi

That is even more logical because if it's not running it should not print out anything (-eq 0). If it is, it should print out something (is not equal to zero). Your script starts up mysql if there is more than one instance running.

@arthurmolina
Copy link

Isn´t it better to check if it is running by using this?

UP=$(service mysql status|grep 'mysql start/running' | wc -l);

@sanchitrasiya
Copy link

sanchitrasiya commented Dec 10, 2015

Unfortunately that hasn't worked for me. This worked well:
File /etc/cron.hourly/sc.sh:

#!/bin/bash
/etc/init.d/mysqld status | grep "stopped\|dead"
if [ $? -eq 0 ]; then
        echo "`date` - MySQL not running" >> /tmp/checkstatus
fi

And to check this every minute, I have added a cron job as:
* * * * * sh /etc/cron.hourly/sc.sh

Hope that helps someone!
-Sanchit

@savalo
Copy link

savalo commented Mar 2, 2016

#!/bin/bash
UP=$(/etc/init.d/mysql status | grep running | grep -v not | wc -l);
if [ "$UP" -ne 1 ];
then
        echo "MySQL is down.";
        service mysql start

else
        echo "All is well.";
fi

@andronick83
Copy link

Worked for me in Debian
* * * * * /usr/sbin/service mysql status || /usr/sbin/service mysql start

@alexvo87
Copy link

awesome!

@richardwhitehead
Copy link

The original script does not work on my system. MySql runs 2 processes, so UP gets set to 2 and it thinks the service is not running.
Simply checking the error code from service status works.
This is on Debian.

@madurapa
Copy link

madurapa commented Dec 21, 2017

If you are using Redhat (RHEL)/Fedora/CentOS

#!/bin/bash
/etc/init.d/mysqld status | grep 'running' > /dev/null 2>&1
if [ $? != 0 ]
then
sudo /etc/init.d/mysqld restart
fi

Don't forget to give the file executable permission sudo chmod +x monitor.sh

@lonelycowboy
Copy link

For me, i used this:

#!/bin/bash
email='email@example.com'
subject='mysql process down and up'
MYSQL_START='sudo service mysql start'
MYSQL='mysqld'
PGREP='/usr/bin/pgrep'
#check pid
$PGREP $MYSQL
if [ $? -ne 0 ]; then
$MYSQL_START | mail -s "$subject" $email <<< 'MySQL service was down and successfully started'
fi

and then
*/5 * * * * /home/user/scripts/mysql_check.sh > /dev/null 2>&1

@jalescardoso
Copy link

Start mysq if not started

UP=$(pgrep mysql | wc -l);
if [ "$UP" -le 1 ];
then
        echo "Iniciando mysql...";
        sudo service mysql start
else
        echo "Mysql online.";
fi

Copy link

ghost commented Aug 16, 2023

One line cron to check and start apache2 and mariadb services if they're not running (you can change mariadb to mysql):

* * * * * if [ $(pgrep apache2 | wc -l) -le 0 ]; then service apache2 start; fi
* * * * * if [ $(pgrep mariadb | wc -l) -le 0 ]; then service mariadb start; fi

@thedoabit
Copy link

thedoabit commented Aug 22, 2023

Better Script:
#!/bin/bash

email='xx@xxx.xx'
subject='MySQL process down and restarted'
MYSQL_START_COMMAND='sudo service mysql start'
MYSQL_PROCESS_NAME='mysqld'
PGREP_COMMAND='/usr/bin/pgrep'

#Check if MySQL is running
$PGREP_COMMAND $MYSQL_PROCESS_NAME

#If MySQL is not running, start it and send an email
if [ $? -ne 0 ]; then
$MYSQL_START_COMMAND
echo 'MySQL service was down and has been successfully started.' | mail -s "$subject" $email
fi

*/5 * * * * /root/mysqlstatus.sh > /dev/null 2>&1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment