我想要一个可以使用 cron 作业运行的 bash shell 脚本,以检查远程服务器上的 mysql 是否正在运行。如果正在运行,则不执行任何操作,而是启动服务器。
cronjob 将每分钟检查远程服务器是否处于活动状态(或非活动状态)。我可以自己编写 cron job,但我需要 shell 脚本的帮助来检查远程 mysql 是处于启动状态还是关闭状态。检查后响应是否处于启动状态并不重要。但检查很重要。
谢谢。
答案1
连接到mysqld
使用mysql管理员
MySQL 文档提到mysqladmin ping
检查服务器是否可用。如果服务器正在运行,mysqladmin 的返回状态为 0,如果服务器未运行,则返回 1。即使出现“拒绝访问”等错误,该返回状态也为 0,因为这意味着服务器正在运行但拒绝连接,这与服务器未运行不同。
首先,创建一个没有权限的用户
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 auth,以便 root 用户无需密码即可登录远程计算机,您可以运行以下命令 -
ssh remotemysql “如果 ['ps -efww | grep mysql| grep -v grep']; 然后回显“服务器已启动”; 否则回显“服务器已关闭”; fi”
用 mysql 启动脚本替换 echo "server is down"。例如 /etc/init.d/mysqld start
答案4
我想要一个 bash shell 脚本,可以使用 cron 作业运行该脚本来检查远程服务器上的 mysql 是否正在运行。
这让我心神不宁。我无法想象为什么有人会认为这是管理服务的好方法。Mysql 附带启动脚本,它将与 systemd 和 sysvinit 集成,而这两种方式是启动 Linux/Unix 系统中服务的标准方式。Systemd 内置了重新启动失败服务的功能 - 但我从未见过默认配置出于非常明显的原因行使此选项,如果有充分的理由这样做,可以通过 sysV 系统上的 inittab 中的 respawn 来调用它。如果这与运行 DBMS 的每个用户实例有关(以 Kmail 的方式),那么触发环应该由用户会话控制,而不是由 cron 控制。
但撇开问题的合法性不谈,使用 mysql 或 mysqladmin 来监控服务状态需要暴露连接数据库的凭据 - 从安全角度来看这不是一个好主意。它还会给资源管理带来麻烦(当您达到最大连接数时,您的服务可能看起来已关闭)
您可以通过以下方式判断服务是否正在运行:
- 在“ps”的输出中或 /proc 文件系统中是否存在 mysqld 进程
- 相关端口上的监听套接字(你可以使用 netcat 探测或从 netstat 的输出中检测)