mysql进程监控必须在操作系统层用脚本+cron实现,通过pgrep或kill-0检查进程存在性,再用mysql命令验证连通性和基础查询能力,三者缺一不可。

MySQL 本身不支持进程级定时存活检查
MySQL 的 EVENT 调度器只能执行 SQL 语句,无法调用系统命令检测 mysqld 进程是否存在。靠它做“进程监控”是无效的——哪怕 MySQL 实例已崩溃,EVENT 也根本不会运行。
真正可行的路径只有一条:在操作系统层用脚本 + cron 定期检查。
用 shell 脚本判断 mysqld 进程是否存活
别依赖 ps aux | grep mysql,它容易误判(比如匹配到 grep 自身或残留日志里的字符串)。稳妥做法是查进程名 + 主 PID 文件:
-
pgrep -f "mysqld.*--basedir" > /dev/null—— 更准,过滤启动参数特征 -
kill -0 $(cat /var/run/mysqld/mysqld.pid 2>/dev/null) 2>/dev/null—— 直接向 PID 发送信号 0(不杀死,只校验存在性) - 优先读取
my.cnf中配置的pid-file路径,而不是硬编码/var/run/mysqld/mysqld.pid
示例片段:
if ! pgrep -f "mysqld.*--basedir" > /dev/null; then echo "$(date): mysqld not found" >> /var/log/mysql/health.log systemctl start mysqld fi
crontab 配置要注意权限和环境变量
直接写 */5 * * * * /path/to/check.sh 很可能失败,因为 cron 默认 PATH 很窄,且没加载用户 profile:
- 脚本开头必须显式声明
#!/bin/bash,并用绝对路径调用命令(如/usr/bin/systemctl) - 在 crontab 里加
SHELL=/bin/bash和PATH=/usr/local/bin:/usr/bin:/bin - 避免用
~或$HOME,全部用绝对路径(/root/scripts/mysql-check.sh) - 测试时先手动执行一遍:
sudo -u root /path/to/check.sh,确认权限和输出
别只看进程,还得验证 MySQL 服务是否真能响应
进程活着 ≠ MySQL 可用。常见情况:mysqld 卡在初始化、连接数打满、磁盘满导致拒绝新连接。所以检查要分两层:
- 第一层:进程存在(用
pgrep或kill -0) - 第二层:能连上并执行简单查询:
mysql -S /var/run/mysqld/mysqld.sock -e "SELECT 1" > /dev/null 2>&1 - 如果 socket 路径不确定,用
mysql --defaults-file=/etc/my.cnf -e "SELECT 1"避免读错配置 - 超时必须设限:
timeout 5 mysql -e "SELECT 1" ...,否则卡住会阻塞后续 cron 任务
真正健壮的检查,是进程 + 连通性 + 基础查询三者都通过。少一个,就不是“存活”。











