Problema no script de shell: script cron job para reiniciar o servidor MySQL quando ele pára acidentalmente

11

Eu tenho esse script, estou usando-o para configurar o trabalho CRON para executar esse script, para que ele possa verificar se o serviço MySQL está em execução; Caso contrário, reinicie o serviço MySQL:

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

Eu configurei o cron job como.

sudo crontab -e

e depois adicionado,

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

O problema é que ele reinicia o MySQL em todas as execuções de tarefas do cron. Mesmo se o servidor estiver em execução, reinicie o serviço MySQL, o que é a correção no script para fazer isso.

Chapéu de palha
fonte
por que você tem um `\` na frente do seu shebang? Se existe para impedir que pareça um comentário, é desnecessário. 'Shebangs são tratados especial, como por Bash, como em que eles não precisam ser escapou porque eles não são comentários no sentido de que um comentário é um pedaço de código que é não avaliadas em tudo .
Alexej Magura
1
Além disso, evite usar [ ... ]ou test <TEST>no Bash. Eles são sintaxe obsoleta . Use em [[ ... ]]vez disso. Use apenas [ ... ]e / ou test <TEST>quando não[[ ... ]] estiver disponível.
Alexej Magura
1
este é o primeiro script de shell que tentei usando alguns scripts disponíveis, apenas o modifiquei. não sei muito sobre sintaxe. problema ainda está lá reiniciado mysql em cada @AlexejMagura execução do trabalho CRON
chapéu de palha
1
Tente algo assim: o if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi que isso faz é iniciar um subshell, no qual service mysql status | grep 'mysql start/running' &> /dev/nullé executado, o status de retorno (saída) do subshell é passado para a instrução if, que verifica se é diferente de zero, e se é não diferente de zero, então ele corre o thenbloco.
AlexJ Magura
O mysql não escreve seu processo pid para pid? Se isso acontecer, você poderia usar isso como uma outra maneira de verificar o status mysql
Flint

Respostas:

17

Eu suspeito que você configurou o trabalho cron para executar este script no seu arquivo crontab, e não no arquivo raiz crontab. Isso não está correto, porque se você não executar service mysql statuscomo root, o mysqlserviço não será reconhecido.

Portanto, modifique o script da seguinte maneira:

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

Certifique-se de que seja executável:

chmod +x /path/to/script

Em seguida, adicione uma nova entrada na raiz crontab da seguinte maneira:

  • Edite o arquivo raiz crontab usando:

    sudo crontab -e
  • E adicione a seguinte linha ao arquivo:

    */1 * * * * /path/to/script
  • Nota: Eu configurei o trabalho cron para cada minuto, mas você pode mudar conforme desejar ou como achar melhor. Veja http://en.wikipedia.org/wiki/Cron neste sentido.

Radu Rădeanu
fonte
Eu configurei-lo como crontab, eu acho problema é com o roteiro, eu vou tentar acima roteiro
chapéu de palha
./mysql-check.sh: line 2: [: =~: binary operator expectederro no script acima
Straw Hat
Eu acredito que você quer para negar que a adequação regex com !se você realmente pretende reiniciar o serviço mysql no acidente
Flint
@ Flint Isso também é verdade ... Desculpe, ainda estou tomando meu café da manhã. :)
Radu Rădeanu
@D_Vaibhav ツ Agora deve estar tudo OK. Então, tente agora, como root.
Radu Rădeanu
3

A resposta de Radu quase funcionou. Eu tive que definir o caminho para fazê-lo funcionar:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
Donkzilla
fonte
1
Na verdade, eu configurei o meu PATHno arquivo crontab. De qualquer forma, no seu caso, você precisa usar PATH=/usr/sbin:$PATHou usar o caminho completo para serviceenquanto editei minha resposta.
Radu Rădeanu
2

A resposta de Radu funciona - mas esse script também funciona

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
JxAxMxIxN
fonte
Eu verifiquei pgrep mysqle cheguei 0para o mysql estar parado e 2em execução. Por isso, defino a condição if [[ $(pgrep mysql | wc -l) = 0 ]];e ela funcionou para mim.
Alin C
provavelmente melhor do seu jeito ... eu vou fazer a mudança.
JxAxMxIxN
Este script funciona com /bin/bash(ele não funciona sem o bash). */1 * * * * /bin/bash /root/mysql-check.sh
Mahfuz 11/04/19