Problem ze skryptem powłoki: skrypt zadania cron do ponownego uruchomienia serwera MySQL, gdy przypadkowo się zatrzyma

11

Mam ten skrypt, używam go do konfiguracji zadania CRON w celu wykonania tego skryptu, aby mógł sprawdzić, czy usługa MySQL jest uruchomiona; jeśli nie, to ponownie uruchom usługę MySQL:

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

Mam ustawione zadanie crona jako.

sudo crontab -e

a następnie dodał

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

Problem polega na tym, że restartuje MySQL przy każdym wykonaniu zadania cron. Nawet jeśli serwer jest uruchomiony, zrestartuj usługę MySQL, co jest poprawione w skrypcie, aby to zrobić.

Słomiany kapelusz
źródło
dlaczego masz znak „\” przed seksem? Jeśli jest po to, aby nie wyglądał jak komentarz, jest to niepotrzebne. Shebangi są traktowane tak jak Bash, ponieważ nie trzeba ich uciekać, ponieważ nie są komentarzami w tym sensie, że komentarz jest fragmentem kodu, który w ogóle nie jest oceniany .
Alexej Magura
1
Unikaj też używania [ ... ]lub test <TEST>w Bash. Są przestarzałą składnią . Użyj [[ ... ]]zamiast tego. Używaj [ ... ]i / lub test <TEST>gdy nie[[ ... ]] jest dostępny.
Alexej Magura
1
to jest pierwszy skrypt powłoki, który próbowałem przy użyciu niektórych dostępnych skryptów, właśnie go zmodyfikowałem. nie wiem dużo o składni. problem jest nadal obecny MySQL uruchamia się ponownie przy każdym wykonaniu zadania CRON @AlexejMagura
Straw Hat
1
Spróbuj czegoś takiego: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi uruchamia podpowłokę, w której service mysql status | grep 'mysql start/running' &> /dev/nulluruchamia się, status powrotu (wyjścia) wspomnianej podpowłoki jest następnie przekazywany do instrukcji if, która następnie sprawdza, czy jest niezerowa, a jeśli to nie niezerowe wtedy uruchamia thenblok.
Alexej Magura
Czy mysql nie zapisuje pid procesu w pliku pid? Jeśli tak, możesz użyć tego jako innego sposobu sprawdzenia swojego statusu mysql
Flint

Odpowiedzi:

18

Podejrzewam, że konfigurujesz zadanie crona do wykonywania tego skryptu w pliku crontab, a nie w głównym pliku crontab. To nie jest poprawne, ponieważ jeśli nie uruchomisz się service mysql statusjako root, mysqlusługa nie zostanie rozpoznana.

Zmodyfikuj skrypt w następujący sposób:

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

Upewnij się, że jest wykonywalny:

chmod +x /path/to/script

Następnie dodaj nowy wpis do tabeli głównej w następujący sposób:

  • Edytuj główny plik crontab, używając:

    sudo crontab -e
  • I dodaj następujący wiersz do pliku:

    */1 * * * * /path/to/script
  • Uwaga: Ustawiłem pracę crona na każdą minutę, ale możesz zmienić to, co chcesz lub według własnego uznania. Zobacz http://en.wikipedia.org/wiki/Cron w tym sensie.

Radu Rădeanu
źródło
Ustawiam go jako crontab, myślę, że problem dotyczy skryptu, spróbuję powyżej skryptu
Straw Hat
./mysql-check.sh: line 2: [: =~: binary operator expectedbłąd w powyższym skrypcie
Straw Hat
Uważam, że chcesz zignorować to dopasowanie wyrażenia regularnego, !jeśli faktycznie zamierzasz zrestartować usługę mysql w przypadku awarii
Flint
@ Flint To też prawda ... Przepraszam, wciąż piję poranną kawę. :)
Radu Rădeanu
@D_Vaibhav ツ Teraz powinno być wszystko OK. Więc spróbuj teraz, jako root.
Radu Rădeanu
3

Odpowiedź Radu prawie działała. Musiałem ustawić ścieżkę, aby działała:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
Donkzilla
źródło
1
W rzeczywistości ustawiłem moje PATHw pliku crontab. W każdym razie, w twoim przypadku musisz użyć PATH=/usr/sbin:$PATHlub skorzystać z pełnej ścieżki, servicegdy edytowałem moją odpowiedź.
Radu Rădeanu
2

Odpowiedź Radu działa - ale ten skrypt również działa

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
JxAxMxIxN
źródło
Sprawdziłem pgrep mysqli dostałem 0zatrzymanie mysql i 2uruchomienie. Dlatego ustawiłem warunek jako if [[ $(pgrep mysql | wc -l) = 0 ]];i zadziałało dla mnie.
Alin C
prawdopodobnie lepiej na swój sposób ... Dokonam zmiany.
JxAxMxIxN
Ten skrypt działa /bin/bash(nie działa bez bash). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz