检查MySQL复制从库脚本
#!/bin/bash
mysql_user='root'
mysql_pass="bhVd!564qazWSX78U#7"
data=$(/bin/date +%Y-%m-%d-%H:%M)
/bin/netstat -lntup|egrep ":3306"|grep -v grep>/dev/null0
if [ $? -eq 0 ];then
Slave_IO=`/data/mysql/bin/mysql -u${mysql_user} -p${mysql_pass} -e "show slave status\G"|grep "Slave_IO_Running:"|awk -F": " '{print $2}'`
Slave_SQL=`/data/mysql/bin/mysql -u${mysql_user} -p${mysql_pass} -e "show slave status\G"|grep "Slave_SQL_Running:"|awk -F": " '{print $2}'`
if [ "$Slave_IO" == "Yes" ] && [ "$Slave_SQL" == "Yes" ];then
STAT=1 && echo "$data mysql-status is ok">>/var/log/mysql-status.log
else
STAT=0 && echo "$data mysql-status is error">>/var/log/mysql-status.log
fi
else
STAT=0 && echo "$data mysql-status is error">>/var/log/mysql-status.log
fi
/usr/bin/zabbix_sender -z 101.227.67.205 -s "DaoDaEr-mysql-status" -k mysql -o $STAT
解析
这个Bash脚本主要用于检查MySQL复制从库的状态,并将状态报告给Zabbix,一个监控工具。以下是脚本工作流程的详细解释:
-
变量定义:
mysql_user
和mysql_pass
用于存储MySQL用户凭证。data
用来获取当前的日期和时间。
-
检查MySQL服务:
- 使用
netstat
命令检查MySQL是否在监听3306端口(MySQL的默认端口)。此步骤的检查结果不直接输出,而是在下一步中进行判断。
- 使用
-
判断服务状态:
- 如果MySQL正在运行(3306端口开放),则执行两个查询来检查复制状态:
Slave_IO_Running
:如果读取主服务器二进制日志的I/O线程正在运行,则此值应为"Yes"。Slave_SQL_Running
:如果执行中继日志事件的SQL线程正在运行,则此值应为"Yes"。
- 如果这两个线程都在运行,则设置
STAT
为1,并记录一条"mysql-status is ok"的日志。 - 如果任一线程未运行,则设置
STAT
为0,并记录一条"mysql-status is error"的日志。
- 如果MySQL正在运行(3306端口开放),则执行两个查询来检查复制状态:
-
MySQL服务关闭时的错误处理:
- 如果MySQL没有运行或不在监听3306端口,它会设置
STAT
为0,并记录一条"mysql-status is error"的日志。
- 如果MySQL没有运行或不在监听3306端口,它会设置
-
Zabbix报告:
- 不管上述检查的结果如何,脚本都会使用
zabbix_sender
将STAT
变量(0或1)发送给Zabbix。这用于向系统管理员报告MySQL复制过程的状态。
- 不管上述检查的结果如何,脚本都会使用
安全和改进建议:
- 密码存储:在脚本中直接存储密码是不安全的。考虑使用安全的配置文件或密码管理工具来处理凭证。
- 错误重定向:脚本中有一个打字错误
>/dev/null0
,应该是>/dev/null
,以正确地将输出重定向到空设备,防止潜在的错误信息出现。 - 脚本健壮性:考虑增加更详细的日志记录或错误处理,以便在出现问题时能更好地诊断。
- 敏感信息:确保敏感信息(如密码或服务器IP地址)被安全处理,不被未授权用户访问。
- 日志机制:这里的日志机制是追加到文件。确保配置了日志轮转,防止日志文件无限制增长。
检查系统中CPU使用率超过指定百分比的进程脚本
#!/bin/bash
# auth:kaliarch
# func:sys info check
# version:v1.0
# sys:centos6.x/7.x
set -e
[ $(id -u) -gt 0 ] && exit 1
# cpu使用超过百分之多少进行限制
PEC_CPU=80
# 限制进程使用百分之多少,如果程序为多线程,单个cpu限制为85,如果为多核心,就需要按照比例写,例如cpu为2c,像限制多线程占比80%,就写170
LIMIT_CPU=85
# 日志
LOG_DIR=/var/log/cpulimit/
# 超过阀值进程pid
PIDARG=$(ps -aux |awk -v CPU=${PEC_CPU} '{if($3 > CPU) print $2}')
CPULIMITCMD=$(which cpulimit)
install_cpulimit() {
[ ! -d /tmp ] && mkdir /tmp || cd /tmp
wget -c https://github.com/opsengine/cpulimit/archive/v0.2.tar.gz
tar -zxf v0.2.tar.gz
cd cpulimit-0.2 && make
[ $? -eq 0 ] && cp src/cpulimit /usr/bin/
}
do_cpulimit() {
[ ! -d ${LOG_DIR} ] && mkdir -p ${LOG_DIR}
for i in ${PIDARG};
do
MSG=$(ps -aux |awk -v pid=$i '{if($2 == pid) print $0}')
echo ${MSG}
[ ! -d /tmp ] && mkdir /tmp || cd /tmp
nohup ${CPULIMITCMD} -p $i -l ${LIMIT_CPU} &
echo "$(date) -- ${MSG}" >> ${LOG_DIR}$(date +%F).log
done
}
main() {
hash cpulimit
if [ $? -eq 0 ];then
do_cpulimit
else
install_cpulimit && do_cpulimit
fi
}
main
解析
这个脚本的主要功能是检查系统中CPU使用率超过指定百分比的进程,并使用cpulimit
工具来限制这些进程的CPU使用率。这对于防止某些进程过度占用CPU资源,从而影响系统整体性能非常有用。下面是脚本的详细解读和一些改进建议:
功能解读
-
环境检查:脚本通过检查用户ID(
id -u
命令)确保只能以root用户运行,以避免权限问题。 -
参数配置:
PEC_CPU
定义了CPU使用率的阈值,超过这个值的进程会被限制。LIMIT_CPU
定义了被限制的进程可以使用的CPU百分比上限。
-
日志目录:定义了存放日志的目录。
-
进程检测:使用
ps
命令检查超过CPU使用率阈值的进程,并获取它们的PID。 -
安装
cpulimit
:如果系统中未安装cpulimit
,则自动从GitHub下载源码、编译并安装。 -
执行限制:对检测到的每个进程,使用
cpulimit
命令限制其CPU使用率,并记录日志。
改进建议
-
安全性:脚本使用了
wget
下载外部资源,建议增加对下载文件的校验,以防止下载恶意修改的版本。 -
健壮性:
- 在使用
mkdir
或cd
命令后直接执行后续命令前,检查命令执行的成功与否,避免在错误的目录下执行命令。 - 对于网络请求(如
wget
),考虑增加重试逻辑以应对网络不稳定情况。
- 在使用
-
效率:脚本中使用
ps -aux
两次(一次用于获取PID,一次用于记录日志),这在进程数很多时可能效率较低。可以考虑只调用一次ps
命令,将结果存储起来供后续使用。 -
兼容性:脚本头部注释指出支持的系统版本为CentOS 6.x/7.x,这意味着在其他发行版或版本中可能存在兼容性问题,尤其是与系统服务管理相关的命令。
-
日志管理:脚本将日志直接写入文件,考虑增加对日志文件大小的监控和轮转机制,避免单个日志文件过大。
-
代码优化:在使用变量时,建议加上双引号以防止字段拆分和路径中的特殊字符解释,例如
mkdir -p "${LOG_DIR}"
。
这个脚本为系统管理员提供了一个自动化工具来监控和限制CPU使用率过高的进程,有助于维护系统性能和稳定性。不过,实际部署前还需要根据具体的系统环境和需求进行适当的调整和测试。