麒麟操作系统内存异常占满问题解决(audit异常占用内存过高)
一、现象
通过监控系统看到项目上使用的多台虚拟机内存过多,导致部分业务运行中断。同时部分虚拟机无法通过22端口远程登录。
二、排查过程
其他虚拟机都有相同的现象,那就找目前内存较高且还能通过22端口登录的虚拟机,通过执行top命令后以内存大小进行排序查看,发现auditd的进程占用27GB,然后在其他虚拟机上也发现auditd进程占用内存大。问题定位后,对无反映的虚拟机进行重启,并利用脚本指标重启。
三、编码脚本
思路:利用sshpass远程依次登录所有虚拟机执行关闭auditd进程。
要求:所有虚拟机安装sshpass命令,若没有需要自行安装。
执行:1)按标黄的内容依次修改为实际值;2)将脚本保存至任意一台虚拟机,并命名为”shutdown_auditd.sh“文件,后执行"dos2unix shutdown_auditd.sh"对行结束符进行转义;3)执行命令批量执行指令,即可完成auditd进程关闭。
注意:要看一下是否有执行失败的ip,若有的话可以手动连接ip后,将systemctl stop auditd && systemctl disable auditd再执行一次,或是将脚本中ConnectTimeout=10值调大,以增加连接等待时间。
#!/bin/bash # 远程服务器的用户名和密码 (!!! 非常不安全 !!!) REMOTE_USER="root" REMOTE_PASSWORD="rootxxxx" # 要在远程服务器上执行的命令 REMOTE_COMMANDS="systemctl stop auditd && systemctl disable auditd" # 目标服务器IP列表 (请根据您的实际IP地址修改) # 请将下面的示例IP替换为您实际需要操作的10台服务器的IP SERVERS=( "172.30.5.192" "172.30.5.195" ) echo "开始远程执行命令..." echo "--------------------" # 循环遍历服务器列表 for server_ip in "${SERVERS[@]}"; do echo "正在连接服务器: $server_ip" # 使用 sshpass 通过密码进行SSH连接并执行命令 # -o StrictHostKeyChecking=no 禁用主机密钥检查 (不安全,但方便自动化) # -o ConnectTimeout=10 设置连接超时时间为10秒 sshpass -p "$REMOTE_PASSWORD" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "$REMOTE_USER@$server_ip" "$REMOTE_COMMANDS" # 检查SSH命令的退出状态 if [ $? -eq 0 ]; then echo "在 $server_ip 上成功执行命令." else echo "在 $server_ip 上执行命令失败 或 SSH连接失败." fi echo "--------------------" done echo "所有服务器处理完成."