Мне нужен скрипт оболочки bash, который я могу запустить с помощью задания cron, чтобы проверить, запущен ли mysql на удаленном сервере. Если запущен, то ничего не делайте, а просто запустите сервер.
Задача cron будет проверять удаленный сервер на наличие работающего (или нет) mysql каждую минуту. Я могу написать задачу cron сам, но мне нужна помощь с shell-скриптом, который проверяет, работает ли удаленный mysql. Ответ после проверки работоспособности или неработоспособности не важен. Но проверка важна.
Спасибо.
решение1
Подключиться к mysqld
использованиюmysqladmin
В документации MySQL говорится оmysqladmin ping
Проверьте, доступен ли сервер. Возвращаемый статус от mysqladmin — 0, если сервер запущен, 1, если нет. Это 0 даже в случае ошибки типа Access denied, поскольку это означает, что сервер запущен, но отклонил соединение, что отличается от состояния, когда сервер не запущен.
Сначала создайте пользователя без привилегий.
mysql> GRANT USAGE ON *.* TO ping@'%' IDENTIFIED BY 'ping';
Создайте такой сценарий
#!/bin/bash
MYSQL_USER=ping
MYSQL_PASS=ping
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqladmin ping ${MYSQL_CONN} 2>/dev/null 1>/dev/null
MYSQLD_RUNNING=${?}
if [ ${MYSQLD_RUNNING} -eq 1 ]; then service mysql start ; fi
Поместите этот скрипт в crontab по своему усмотрению.
Убедитесь, что брандмауэр открыт на порту 3306, чтобы ping@'%' мог подключиться.
решение2
Проверить это очень просто:
mysql -e "select 1" || echo down
Вы можете заменить echo на команду ssh в root для запуска службы, но это кажется немного рискованным. Это может иметь последствия для безопасности. Это может быть ненадежно. Я бы предположил, что вам, вероятно, следует иметь какое-то надлежащее программное обеспечение кластера/отказа, чтобы сделать это. Есть MySQL MMM, который мы использовали некоторое время, но я понимаю, что он вышел из моды.
решение3
Предполагая, что у вас есть аутентификация sshkey для беспарольного входа пользователя root на удаленную машину, вы можете выполнить следующую команду:
ssh remotemysql "if [ 'ps -efww | grep mysql| grep -v grep' ]; then echo "сервер работает" ; else echo "сервер не работает"; fi"
замените echo "server is down" на скрипт запуска mysql. скажем /etc/init.d/mysqld start
решение4
Мне нужен скрипт оболочки bash, который можно запустить с помощью задания cron, чтобы проверить, работает ли MySQL на удаленном сервере.
Это наполняет меня тревогой. Я не могу себе представить, почему кто-то может подумать, что это хороший способ управления службой. Mysql поставляется со скриптами запуска, которые будут интегрироваться с systemd и sysvinit, которые являются стандартными способами запуска службы в системе Linux/Unix. Systemd имеет встроенную возможность перезапуска неисправной службы, но я никогда не видел конфигурации по умолчанию, использующей эту возможность по вполне очевидным причинам, и если бы была веская причина для этого, ее можно было бы вызвать с помощью respawn из inittab в системе sysV. Если это относится к запуску экземпляра СУБД для каждого пользователя (как это делает Kmail), то triggerring должен контролироваться сеансом пользователя, а не cron.
Но оставляя в стороне законность вопроса, использование mysql или mysqladmin для мониторинга состояния сервиса влечет за собой раскрытие учетных данных для подключения к базе данных, что не очень хорошая идея с точки зрения безопасности. Это также создает сложности с управлением ресурсами (когда вы достигаете максимального количества подключений, может показаться, что ваш сервис не работает)
Узнать, запущена ли служба, можно по:
- наличие процесса mysqld в выводе 'ps' или в файловой системе /proc
- прослушивающий сокет на соответствующем порту (который можно проверить с помощью netcat или обнаружить по выходным данным netstat)