编写可执行shell脚本需指定解释器、赋执行权限;用crontab实现周期执行;ssh密钥支持远程批量操作;封装函数提升可维护性;集成邮件告警确保及时响应。

一、编写可执行的Shell脚本文件
Shell脚本是将一系列Linux命令按逻辑组织起来的文本文件,需明确指定解释器并赋予执行权限才能运行。未正确设置时,系统会提示“Permission denied”或“No such file or directory”错误。
1、使用vim或nano创建新文件,例如:vim system_check.sh
2、在首行写入解释器声明:#!/bin/bash
3、输入具体命令内容,如:echo "当前时间:$(date)" && df -h | grep '/$'
4、保存退出:按Esc键后输入:wq回车
5、添加执行权限:chmod +x system_check.sh
二、通过crontab实现周期性自动执行
crontab是Linux内置的定时任务调度器,适用于日志清理、资源巡检、备份等需规律触发的运维场景。配置错误会导致脚本从不运行或重复执行。
1、编辑当前用户定时任务:crontab -e
2、在末尾新增一行,格式为“分 时 日 月 周 命令路径”,例如:0 3 * * * /root/scripts/system_check.sh
3、保存退出后,系统自动加载规则,无需重启服务
4、验证配置是否生效:crontab -l
5、若需临时禁用某条任务,在该行开头添加#符号注释
三、使用SSH密钥实现远程批量操作
手动输入密码会中断自动化流程,SSH密钥认证可使脚本无交互式登录多台服务器,是批量运维的前提条件。
1、在控制机生成RSA密钥对:ssh-keygen -t rsa -b 4096(连续回车使用默认路径与空密码)
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
2、将公钥复制至目标主机:ssh-copy-id user@192.168.1.100
3、测试免密登录是否成功:ssh user@192.168.1.100 'hostname'
4、在本地脚本中嵌入远程命令调用,例如:for host in web1 web2 db1; do ssh $host "uptime"; done
四、封装函数提升脚本可维护性
将重复逻辑抽象为函数,避免代码冗余,便于阈值调整、日志记录与告警扩展。未经封装的脚本难以应对多指标监控等复杂需求。
1、定义磁盘检查函数:check_disk() { local usage=$(df -h / | awk '/\// {print $5}' | tr -d '%'); [ $usage -gt 90 ] && echo "警告:根分区使用率${usage}%"; }
2、定义内存检查函数:check_mem() { local usage=$(free | awk '/Mem:/ {printf "%d", $3/$2*100}'); [ $usage -gt 85 ] && echo "警告:内存使用率${usage}%"; }
3、在脚本主体中调用:check_disk; check_mem
4、为函数添加日志输出能力:log_msg() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> /var/log/monitor.log; }
五、集成邮件告警机制
当资源超限时仅打印终端信息无法及时响应,需通过邮件将异常状态主动推送至管理员邮箱,确保问题被即时感知。
1、确认系统已安装mailutils或mailx:apt install mailutils(Debian/Ubuntu)或yum install mailx(CentOS/RHEL)
2、测试基础邮件发送:echo "测试告警" | mail -s "告警测试" admin@example.com
3、在检查逻辑中嵌入告警分支:[ $cpu_usage -gt 80 ] && echo "CPU超限:${cpu_usage}%" | mail -s "CPU告警" admin@example.com
4、将告警动作与日志记录合并:[ $disk_usage -gt 90 ] && { echo "磁盘告警" | mail -s "磁盘超限" admin@example.com; log_msg "DISK_WARN ${disk_usage}%"; }










