Проблема сценария оболочки: сценарий задания 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
Соломенная Шляпа

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
  • Примечание: я установил задание cron на каждую минуту, но вы можете изменить его по своему усмотрению или по своему усмотрению. См. Http://en.wikipedia.org/wiki/Cron в этом смысле.


Я установил его как crontab, думаю, проблема в скрипте, я попробую скрипт выше
Straw Hat

./mysql-check.sh: line 2: [: =~: binary operator expectedошибка в приведенном выше сценарии
Соломенная Шляпа

Я полагаю, что вы хотите отменить это регулярное выражение, !если вы действительно намереваетесь перезапустить службу mysql при сбое
Flint

@Flint Это тоже правда ... Извините, я все еще пью свой утренний кофе. :)
Раду Рэдяну

@D_Vaibhav ツ Теперь все должно быть в порядке. Итак, попробуйте сейчас, как root.
Раду Рэдяну

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как я редактировал мой ответ.
Раду Рэдяну

2

Ответ Раду работает - но этот сценарий также работает

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

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

Наверное, лучше по-твоему ... Я внесу изменения.
JxAxMxIxN

Этот скрипт работает с /bin/bash(он не работает без Bash). */1 * * * * /bin/bash /root/mysql-check.sh
Махфуз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.