-
-
Save mheadd/5571023 to your computer and use it in GitHub Desktop.
#!/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 |
I had to set the PATH variable to include /sbin in the crontab for the script to be run successfully by cron.
PATH=/usr/sbin:/usr/bin:/sbin:/bin
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.
Isn´t it better to check if it is running by using this?
UP=$(service mysql status|grep 'mysql start/running' | wc -l);
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
#!/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
Worked for me in Debian
* * * * * /usr/sbin/service mysql status || /usr/sbin/service mysql start
awesome!
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.
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
For me, i used this:
#!/bin/bash
email='[email protected]'
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
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
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
Better Script:
#!/bin/bash
email='[email protected]'
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
Run this script every 5 minutes using a cron job like this one: