银河麒麟系统巡检脚本需适配bash环境、POSIX兼容命令及sudo权限策略:首行用#!/bin/bash,df加-P参数,free/ps/ss精准过滤,服务检查优先systemctl,日志按时间戳生成,crontab调用绝对路径bash执行。

在银河麒麟操作系统中编写自动化运维巡检Shell脚本,需适配其基于Linux内核、默认使用bash、预装sysstat和procps等工具的特性,同时避开国产化环境常见的sudo权限策略限制和SELinux策略拦截。
确认基础运行环境与权限前提
执行cat /etc/os-release | grep -E "(NAME|VERSION)"验证系统为银河麒麟V10或V11,确保当前用户具有/usr/bin/写入权限或已获sudo免密执行dftopss等命令授权。
运行which bash确认解释器路径为/bin/bash(V10默认)或/usr/bin/bash(部分V11定制版),脚本首行必须严格匹配该路径,否则crontab执行时会报bad interpreter错误。
检查sudo -l输出,若巡检需获取root级进程或磁盘IO数据,【必须提前将对应命令加入sudoers且禁用密码提示,例如:%ops ALL=(ALL) NOPASSWD: /usr/bin/df, /usr/bin/iostat】。
编写核心巡检逻辑模块
创建脚本文件/opt/scripts/kylin-check.sh,以#!/bin/bash开头(不可用#!/usr/bin/env bash,因麒麟部分镜像未将env加入PATH安全白名单)。
定义时间戳与日志路径:LOG_DIR="/var/log/kylin-inspect"; mkdir -p "$LOG_DIR"; LOG_FILE="$LOG_DIR/$(date +\%Y\%m\%d_\%H\%M).log"。
逐项采集关键指标:
① 磁盘使用率:执行df -hP | awk '$5+0 > 85 {print "ALERT: "$1" usage "$5" >85%"}',此处用-P参数强制POSIX格式,避免麒麟某些版本df输出列数不一致导致awk越界。
② 内存剩余量:用free -m | awk 'NR==2{if($7+0 ,直接读取available列(非free列),因麒麟V10起内核启用memory cgroup后free列已失效。
③ 异常进程:运行ps aux --sort=-%cpu | head -n 6 | tail -n +2 | awk '+0 > 90 {print "HIGH CPU: ""("") ""%"}',跳过标题行并过滤CPU持续超90%的进程,避免误报systemd等短时峰值进程。
集成服务状态与端口监听检查
方法一:检查systemd服务(适用于麒麟V10 SP1及以上)
循环检测关键服务:for svc in sshd chronyd firewalld; do systemctl is-active --quiet "$svc" || echo "SERVICE DOWN: $svc"; done >> "$LOG_FILE"。
方法二:回退兼容方式(适配早期麒麟或裁剪版)
用ps aux | grep -v grep | grep "$svc" >/dev/null || echo "PROCESS MISSING: $svc"替代,注意grep自身进程干扰,【务必加-v grep过滤,否则永远返回存在】。
端口监听检查统一用ss -tuln | awk '$5 ~ /:22$|:80$|:443$/ {print "LISTENING: "$5}',不使用netstat(麒麟多数镜像已移除),且正则锚定结尾冒号+端口号,防止匹配到122、8080等干扰项。
设置定时任务并验证执行权限
切换至root用户执行crontab -e,添加行:0 3 * * * /bin/bash /opt/scripts/kylin-check.sh 2>/dev/null,指定绝对路径调用bash而非依赖PATH。
手动测试执行:sudo /opt/scripts/kylin-check.sh,观察/var/log/kylin-inspect/下是否生成带时间戳的日志文件,且内容包含磁盘、内存、服务三类检查结果。
检查cron日志:journalctl -u cron | grep kylin-check.sh,确认无Permission denied或No such file or directory报错。











