mysql cron job - E-mail apenas quando reiniciado

1

Eu tenho o seguinte cron job e ele é executado a cada 5 minutos (ele realmente 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

Ao executar o status do mysql (em execução)

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.

ao executar o status do mysql (parado)

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.

O único problema que tenho é que ele envia um e-mail informando que o serviço foi reiniciado toda vez, mesmo quando não foi feito. Eu quero que ele só envie quando o serviço realmente foi reiniciado de parado.

Alguém pode explicar qual parte eu tenho errado

    
por Ben Richardson 09.12.2015 / 13:40

1 resposta

1

Há um problema em sua declaração if. O ! no início do teste de condição significa que você está procurando se a expressão "$(/usr/sbin/service mysql status)" é falsa, o que não é o que você deseja alcançar. Você deseja verificar se o resultado do comando de status do serviço não é uma cadeia que contém 'start / waiting'. != é a melhor maneira de dizer que não é igual a.

Além disso, o =~ está esperando uma expressão regular, em que você está apenas fornecendo uma parte da string que espera ver. Como a sintaxe de colchetes duplos de instruções if suporta shell globbing, você pode procurar por 'start / waiting' com *start/waiting* .

Se você alterar a linha:

if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]

Para:

if [[ "$(/usr/sbin/service mysql status)" != *start/running* ]]

Seu script deve funcionar corretamente; caso contrário, acho que você está reiniciando o serviço e enviando e-mails toda vez que o script é executado.

EDITAR:

O seguinte não é uma solução ideal, estou apenas postando para tentar ajudar na situação atual que você está enfrentando.

Para tentar lidar com a saída de systemd-sysv-generator , você pode tentar substituir a primeira linha da instrução if por:

if [[ "$(/usr/sbin/service mysql status)" = *inactive* ]]
    
por Arronical 09.12.2015 / 14:58