Problema di script Shell: cron job script per riavviare il server MySQL quando si arresta accidentalmente


11

Ho questo script, lo sto usando per configurare il lavoro CRON per eseguire questo script, in modo che possa verificare se il servizio MySQL è in esecuzione; in caso contrario, riavvia il servizio MySQL:

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

Ho impostato cron job come.

sudo crontab -e

e poi aggiunto,

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

Il problema è che riavvia MySQL ad ogni esecuzione di cron job .. anche se il server è in esecuzione, riavvia il servizio MySQL che cosa è la correzione nello script per farlo.


perché hai un \ \ `davanti al tuo shebang? Se è lì per impedirgli di sembrare un commento, non è necessario. Gli shebang sono trattati in modo speciale come da Bash, poiché non hanno bisogno di essere sfuggiti perché non sono commenti nel senso che un commento è un pezzo di codice che non viene valutato affatto .
Alexej Magura,

1
Inoltre, evitare di usare [ ... ]o test <TEST>in Bash. Sono sintassi deprecata . Usa [[ ... ]]invece. Utilizzare solo [ ... ]e / o test <TEST>quando non[[ ... ]] è disponibile.
Alexej Magura,

1
questo è il primo script di shell che ho provato usando alcuni script disponibili, l'ho appena modificato. non so molto sulla sintassi. il problema è ancora presente mysql si riavvia ad ogni esecuzione del lavoro CRON @AlexejMagura
Cappello di paglia

1
Prova qualcosa del genere: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi cosa fa, avvia una subshell, in cui service mysql status | grep 'mysql start/running' &> /dev/nullviene eseguito, lo stato di ritorno (uscita) di tale subshell viene quindi passato all'istruzione if, che controlla quindi se è diverso da zero, e se è non è diverso da zero, allora si corre il thenblocco.
Alexej Magura,

Mysql non scrive il suo processo pid in file pid? In questo caso potresti usarlo come un altro modo per controllare il tuo stato mysql
Flint,

Risposte:


18

Ho il sospetto che tu abbia impostato il lavoro cron per eseguire questo script nel tuo file crontab e non nel file crontab di root. Questo non è corretto perché se non si esegue service mysql statuscome root, il mysqlservizio non verrà riconosciuto.

Quindi, modifica lo script come segue:

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

Assicurati che sia eseguibile:

chmod +x /path/to/script

Quindi aggiungere una nuova voce nel crontab root come segue:

  • Modifica il file crontab di root usando:

    sudo crontab -e
  • E aggiungi la seguente riga al file:

    */1 * * * * /path/to/script
  • Nota: ho impostato il lavoro cron per ogni minuto, ma puoi cambiare come desideri o come pensi sia meglio. Vedi http://en.wikipedia.org/wiki/Cron in questo senso.


Lo installo come crontab, immagino che il problema sia con lo script, proverò sopra lo script
Cappello di paglia

./mysql-check.sh: line 2: [: =~: binary operator expectederrore nello script sopra
Cappello di paglia

Credo che tu voglia negare la corrispondenza di regex con !se intendi effettivamente riavviare il servizio mysql in caso di arresto anomalo
Flint

@Flint È vero anche ... Mi dispiace, sto ancora bevendo il mio caffè mattutino. :)
Radu Rădeanu,

@D_Vaibhav ツ Ora dovrebbe essere tutto a posto. Quindi, prova ora, come root.
Radu Rădeanu,

3

La risposta di Radu quasi funzionò. Ho dovuto impostare il percorso per farlo funzionare:

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

1
In effetti ho impostato il mio PATHnel file crontab. In ogni caso, nel tuo caso devi utilizzare PATH=/usr/sbin:$PATHo utilizzare il percorso completo per servicecome ho modificato la mia risposta.
Radu Rădeanu,

2

La risposta di Radu funziona, ma funziona anche questo script

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi

Ho controllato il pgrep mysqle ho ottenuto 0per mysql essere fermato e 2per l'esecuzione. Pertanto ho impostato la condizione if [[ $(pgrep mysql | wc -l) = 0 ]];e ha funzionato per me.
Alin C,

probabilmente meglio a modo tuo ... Farò il cambiamento.
JxAxMxIxN,

Questo script funziona con /bin/bash(non funziona senza bash). */1 * * * * /bin/bash /root/mysql-check.sh
Mahfuz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.