Випуск сценарію Shell: скрипт завдання cron на перезапуск сервера MySQL, коли він випадково зупиняється


11

У мене є цей скрипт, я використовую його для установки завдання CRON для виконання цього сценарію, щоб він міг перевірити, чи працює служба MySQL; якщо ні, то перезавантажте службу MySQL:

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

У мене встановлення cron робота як.

sudo crontab -e

а потім додали,

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

Проблема полягає в тому, що він перезапускає MySQL при кожному виконанні завдання cron .. навіть якщо сервер працює, перезавантажте службу MySQL, що є корекцією в сценарії.


чому ти маєш "\" перед своїм шебангом? Якщо це є для того, щоб це не виглядало як коментар, то це зайве. Shebangs розглядаються спеціальні , як з допомогою Bash, так як в них не повинні бути екрановані , тому що вони не є коментарями в тому сенсі , що коментар є частиною коду , який НЕ оцінюється взагалі .
Олексій Магура

1
Також уникайте використання [ ... ]або test <TEST>в Bash. Вони застаріли синтаксисом . Використовуйте [[ ... ]]замість цього. Тільки використовувати [ ... ]і / або test <TEST>якщо [[ ... ]]це НЕ є.
Олексій Магура

1
це перший скрипт оболонки, який я спробував за допомогою деяких доступних сценаріїв, я просто змінив його. не знаю багато про синтаксис. Проблема все ще існує, що mysql перезапускається при кожному виконанні завдання CRON @AlexejMagura
Straw Hat

1
Спробуйте щось на кшталт цього: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi що це робить, чи запускає підзарядку, в якій service mysql status | grep 'mysql start/running' &> /dev/nullотримує запуск, стан повернення (виходу) зазначеної підпакеті потім переходить до оператора if, який потім перевіряє, чи є він не нульовим, а якщо він не є нульовим, то він запускає thenблок.
Олексій Магура

Чи не mysql записує процес pid у файл pid? Якщо це так, ви можете використати це як інший спосіб перевірити свій статус mysql
Флінт,

Відповіді:


18

Я підозрюю, що ви налаштуєте завдання cron для виконання цього сценарію у вашому файлі crontab, а не в кореневому файлі crontab. Це неправильно, оскільки якщо ви не запустите service mysql statusяк root, mysqlсервіс не буде розпізнаний.

Отже, змініть сценарій так:

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

Будьте впевнені, що виконується:

chmod +x /path/to/script

Потім додайте новий запис у кореневій crontab так:

  • Редагуйте кореневий файл crontab за допомогою:

    sudo crontab -e
  • І додайте у файл наступний рядок:

    */1 * * * * /path/to/script
  • Примітка: я встановлюю завдання на крон на кожну хвилину, але ви можете змінити, як хочете, або, як вам здається, краще. Див. Http://en.wikipedia.org/wiki/Cron у цьому сенсі.


Я налаштовую це як crontab, я думаю, проблема в сценарії, я спробую вище сценарій
Straw Hat

./mysql-check.sh: line 2: [: =~: binary operator expectedпомилка у вищезгаданому сценарії
солом’яний капелюх

Я вважаю, що ви хочете заперечити відповідність регулярного виразу, !якщо ви насправді маєте намір перезапустити службу mysql при збої
Флінт,

@Flint Це теж так ... Вибачте, я все ще п'ю свою ранкову каву. :)
Radu Rădeanu

@D_Vaibhav ツ Тепер має бути все гаразд. Отже, спробуйте зараз як root.
Radu Rădeanu

3

Відповідь Раду ледь не спрацювала. Мені довелося встановити шлях, щоб він працював:

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

1
Насправді я поставив своє PATHу файл crontab. У будь-якому випадку, у вашому випадку вам потрібно використовувати PATH=/usr/sbin:$PATHабо використовувати повний шлях, serviceколи я редагував свою відповідь.
Radu Rădeanu

2

Відповідь Раду працює - але цей сценарій також працює

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

Я перевірив, pgrep mysqlі мені вдалося 0зупинити MySQL і 2працювати. Для цього я встановив умову так, як if [[ $(pgrep mysql | wc -l) = 0 ]];вона працювала на мене.
Алін C

Мабуть, краще ваш шлях ... Я зроблю зміни.
JxAxMxIxN

Цей сценарій працює з /bin/bash(він не працює без bash). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.