Problema de script de Shell: script de trabajo cron para reiniciar el servidor MySQL cuando se detiene accidentalmente

11

Tengo este script, lo estoy usando para configurar el trabajo CRON para ejecutar este script, para que pueda verificar si el servicio MySQL se está ejecutando; de lo contrario, reinicia el servicio MySQL:

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

He configurado el trabajo cron como.

sudo crontab -e

y luego agregó

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

El problema es que reinicia MySQL en cada ejecución de trabajo cron ... incluso si el servidor se está ejecutando, reinicia el servicio MySQL, ¿qué es la corrección en el script para hacerlo?

Sombrero de copa
fuente
¿Por qué tienes un `\ 'delante de tu shebang? Si está allí para evitar que parezca un comentario, entonces es innecesario. Los shebangs son tratados de manera especial por Bash, ya que no necesitan escapar porque no son comentarios en el sentido de que un comentario es un fragmento de código que no se evalúa en absoluto .
Alexej Magura
1
Además, evite usar [ ... ]o test <TEST>en Bash. Son sintaxis obsoleta . Usar en su [[ ... ]]lugar. Sólo utilizar [ ... ]y / o test <TEST>cuando [[ ... ]]es no disponible.
Alexej Magura
1
este es el primer script de shell que probé usando algunos scripts disponibles, simplemente lo modifiqué. No sé mucho sobre sintaxis. el problema sigue ahí mysql se reinicia en cada ejecución de trabajo CRON @AlexejMagura
Straw Hat
1
Pruebe algo como esto: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi lo que esto hace es iniciar una subshell, en la que service mysql status | grep 'mysql start/running' &> /dev/nullse ejecuta, el estado de retorno (salida) de dicha subshell luego se pasa a la instrucción if, que luego comprueba si no es cero, y si es no distinto de cero, entonces se ejecuta el thenbloque.
Alexej Magura
¿MySql no escribe su proceso pid a pid? Si lo hace, podría usar eso como otra forma de verificar su estado de MySQL
Flint

Respuestas:

18

Sospecho que configuró el trabajo cron para ejecutar este script en su archivo crontab, y no en el archivo raíz crontab. Esto no es correcto porque si no se ejecuta service mysql statuscomo root, mysqlno se reconocerá el servicio.

Entonces, modifique el script de la siguiente manera:

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

Asegúrese de que sea ejecutable:

chmod +x /path/to/script

Luego agregue una nueva entrada en el crontab raíz de la siguiente manera:

  • Edite el archivo crontab raíz usando:

    sudo crontab -e
  • Y agregue la siguiente línea al archivo:

    */1 * * * * /path/to/script
  • Nota: He configurado el trabajo cron para cada minuto, pero puede cambiarlo como lo desee o como considere mejor. Ver http://en.wikipedia.org/wiki/Cron en este sentido.

Radu Rădeanu
fuente
Lo configuré como crontab, supongo que el problema está en el script, intentaré el script anterior
Straw Hat
./mysql-check.sh: line 2: [: =~: binary operator expectederror en el guión anterior
Sombrero de paja
Creo que quiere negar esa coincidencia de expresiones regulares !si realmente tiene la intención de reiniciar el servicio mysql en caso de falla
Flint
@ Flint Eso también es cierto ... Lo siento, todavía estoy tomando mi café de la mañana. :)
Radu Rădeanu
@D_Vaibhav ツ Ahora debería estar todo bien. Entonces, intente ahora, como root.
Radu Rădeanu
3

La respuesta de Radu casi funcionó. Tuve que establecer el camino para que funcione:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
Donkzilla
fuente
1
De hecho, he configurado mi PATHen el archivo crontab. De todos modos, en su caso debe usar PATH=/usr/sbin:$PATHo usar la ruta completa servicemientras edito mi respuesta.
Radu Rădeanu
2

La respuesta de Radu funciona, pero este script también funciona

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
JxAxMxIxN
fuente
Lo comprobé pgrep mysqly conseguí 0que mysql fuera detenido y 2que corriera. Por lo tanto, establecí la condición como if [[ $(pgrep mysql | wc -l) = 0 ]];y funcionó para mí.
Alin C
probablemente mejor a tu manera ... Haré el cambio.
JxAxMxIxN
Este script funciona con /bin/bash(no funciona sin bash). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz