Shell脚本分享与优化

文章介绍了两个Bash脚本,一个用于检查MySQL复制从库的运行状态,并将其报告给Zabbix;另一个监控系统中CPU使用率超过阈值的进程并实施限制。脚本提供了详细的工作流程和改进建议,强调了安全性和代码优化的重要性。
摘要由CSDN通过智能技术生成

检查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,一个监控工具。以下是脚本工作流程的详细解释:

  1. 变量定义

    • mysql_usermysql_pass 用于存储MySQL用户凭证。
    • data 用来获取当前的日期和时间。
  2. 检查MySQL服务

    • 使用 netstat 命令检查MySQL是否在监听3306端口(MySQL的默认端口)。此步骤的检查结果不直接输出,而是在下一步中进行判断。
  3. 判断服务状态

    • 如果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"的日志。
  4. MySQL服务关闭时的错误处理

    • 如果MySQL没有运行或不在监听3306端口,它会设置STAT为0,并记录一条"mysql-status is error"的日志。
  5. Zabbix报告

    • 不管上述检查的结果如何,脚本都会使用zabbix_senderSTAT变量(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资源,从而影响系统整体性能非常有用。下面是脚本的详细解读和一些改进建议:

功能解读

  1. 环境检查:脚本通过检查用户ID(id -u命令)确保只能以root用户运行,以避免权限问题。

  2. 参数配置

    • PEC_CPU定义了CPU使用率的阈值,超过这个值的进程会被限制。
    • LIMIT_CPU定义了被限制的进程可以使用的CPU百分比上限。
  3. 日志目录:定义了存放日志的目录。

  4. 进程检测:使用ps命令检查超过CPU使用率阈值的进程,并获取它们的PID。

  5. 安装cpulimit:如果系统中未安装cpulimit,则自动从GitHub下载源码、编译并安装。

  6. 执行限制:对检测到的每个进程,使用cpulimit命令限制其CPU使用率,并记录日志。

改进建议

  1. 安全性:脚本使用了wget下载外部资源,建议增加对下载文件的校验,以防止下载恶意修改的版本。

  2. 健壮性

    • 在使用mkdircd命令后直接执行后续命令前,检查命令执行的成功与否,避免在错误的目录下执行命令。
    • 对于网络请求(如wget),考虑增加重试逻辑以应对网络不稳定情况。
  3. 效率:脚本中使用ps -aux两次(一次用于获取PID,一次用于记录日志),这在进程数很多时可能效率较低。可以考虑只调用一次ps命令,将结果存储起来供后续使用。

  4. 兼容性:脚本头部注释指出支持的系统版本为CentOS 6.x/7.x,这意味着在其他发行版或版本中可能存在兼容性问题,尤其是与系统服务管理相关的命令。

  5. 日志管理:脚本将日志直接写入文件,考虑增加对日志文件大小的监控和轮转机制,避免单个日志文件过大。

  6. 代码优化:在使用变量时,建议加上双引号以防止字段拆分和路径中的特殊字符解释,例如mkdir -p "${LOG_DIR}"

这个脚本为系统管理员提供了一个自动化工具来监控和限制CPU使用率过高的进程,有助于维护系统性能和稳定性。不过,实际部署前还需要根据具体的系统环境和需求进行适当的调整和测试。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今晚务必早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值