
Tengo el siguiente trabajo cron y se ejecuta cada 5 minutos (en realidad funciona)
#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ "$(/usr/sbin/service mysql status)" != *start/running* ]]
then
echo "MySQL restarted" | mail -a FROM:*@* -s "[Marketing Server] Database Service" *@*
sudo service mysql start
fi
Al ejecutar el estado de MySQL (en ejecución)
mysql.service - LSB: Start and stop the mysql database server daemon Loaded: loaded (/etc/init.d/mysql) Active: active (exited) since Wed 2015-12-09 15:01:40 GMT; 21h ago Docs: man:systemd-sysv-generator(8) Process: 30829 ExecStop=/etc/init.d/mysql stop (code=exited, status=0/SUCCESS) Process: 30910 ExecStart=/etc/init.d/mysql start (code=exited,status=0/SUCCESS)
Dec 10 12:10:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:15:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:20:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:25:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:30:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:35:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:40:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:45:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:50:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:55:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Hint: Some lines were ellipsized, use -l to show in full.
al ejecutar el estado de mysql (detenido)
david@MarketingServer:~$ sudo service mysql stop ^[[Adavid@MarketingServer:~$ sudo service mysql status ● mysql.service - LSB: Start and stop the mysql database server daemon Loaded: loaded (/etc/init.d/mysql) Active: inactive (dead) since Thu 2015-12-10 13:03:26 GMT; 1s ago Docs: man:systemd-sysv-generator(8) Process: 5024 ExecStop=/etc/init.d/mysql stop (code=exited, status=0/SUCCESS) Process: 30910 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
Dec 10 12:35:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:40:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:45:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:50:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:55:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 13:00:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 13:03:24 MarketingServer systemd[1]: Stopping LSB: Start and stop the.... Dec 10 13:03:24 MarketingServer mysql[5024]: * Stopping MySQL database serve...d Dec 10 13:03:26 MarketingServer mysql[5024]: ...done. Dec 10 13:03:26 MarketingServer systemd[1]: Stopped LSB: Start and stop the .... Hint: Some lines were ellipsized, use -l to show in full.
El único problema que tengo es que envía un correo electrónico indicando que el servicio se ha reiniciado cada vez, incluso cuando no es así. Quiero que solo se envíe cuando el servicio se haya reiniciado desde que se detuvo.
¿Alguien puede explicar en qué parte me equivoqué?
Respuesta1
Hay un par de problemas en su declaración if. La !
prueba al comienzo de la condición significa que estás buscando si la expresión "$(/usr/sbin/service mysql status)"
es falsa, que no es lo que quieres lograr. Desea verificar que el resultado del comando de estado del servicio no sea una cadena que contenga "inicio/espera". !=
es la mejor manera de decir no igual a.
Además, =~
espera una expresión regular, en la que solo proporciona una parte de la cadena que espera ver. Como la sintaxis de doble corchete de las declaraciones if admite la globalización de shell, puede buscar 'inicio/espera' con *start/waiting*
.
Si cambias la línea:
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
A:
if [[ "$(/usr/sbin/service mysql status)" != *start/running* ]]
Su secuencia de comandos debería funcionar correctamente; de lo contrario, creo que reiniciará el servicio y enviará un correo electrónico cada vez que se ejecute la secuencia de comandos.
EDITAR:
La siguiente no es una solución ideal, solo la publico para intentar ayudar con la situación actual que enfrenta.
Para intentar hacer frente al resultado, systemd-sysv-generator
puede intentar reemplazar la primera línea de la if
declaración con:
if [[ "$(/usr/sbin/service mysql status)" = *inactive* ]]