shell脚本实战 | 6个入门级shell脚本(CPU负载、监控、计划任务)

发布于:2022-12-14 ⋅ 阅读:(1808) ⋅ 点赞:(2)

前言:shell脚本博大精深,本文只起到一个抛砖引玉的作用,望共同进步。

注:本文的shell编写目录,默认为/root/myshell目录下进行,案例中不再一一累述。

导引:本文给出的六个小案例,都给出了提纲,如对某个案例感兴趣,可根据提纲,直入主题。

1.示例一:随意输入两个整数,计算其平方和

方法一:使用系统预定义变量(非交互式)

1.编写脚本

#vim pingfang  

脚本内容

#!/bin/bash

#count two number square sum

result=$(expr $1 \* $1 + $2 \* $2 )

echo "$1和$2的平方和=$result" 

注:expr是算式的前缀,乘号由于是特殊字符,需要转义,每个计算符号前后,都需要有空格。$()的作用和反撇号一致。 

2.验证脚本 

#. pingfang 5  2 注:点后面有个空格

 

 方法二:交互式(read -p)

1.编写脚本

#vim pingfang.sh

脚本内容 

 #!/bin/bash
#计算两个数的平方和
read -p "请随意输入两个整数,用于计算平方和(中间用空格隔开):" num1 num2
result=$(expr $num1 \* $num1 + $num2 \* $num2)
echo "$num1和$num2的平方和=$result"

注:read -p 可实现交互式输入。 

 

 2.验证脚本

#. pingfang.sh  运行并查看结果

 

2.示例二:对/etc/init.d下的服务,实现随意、启动 停止 当前状态的查看

#ls /etc/init.d  查看一下该目录下都有哪些服务

 

 1.编写脚本

#vim service.sh

 #!/bin/bash
/etc/init.d/$1  $2

注:$1 $2 是系统的预定义变量,此处也可以理解为在实际命令中的占位符(分别替换实际命令中的两个位置)。 

2.验证脚本

#service.sh network stop 
#service.sh network start 
#service.sh network restart

 

3.示例三:过滤出本机ech网卡的MAC地址,并赋值给变量hwaddr

1.编写脚本

#vim hwaddr.sh

#!/bin/bash
Hwaddr=$(ifconfig | grep eth | awk '{print $2}')
echo "网卡的MAC地址:$Hwaddr" 

 

注:| grep eth 从前面的结果集中,过滤出 带有eth字母的行 

awk 命令是文本处理命令,很强大 {print $2 },打印出结果集的第二列。 

2.验证脚本

#. hwaddr.sh 运行,查看结果

 

4.示例四:计算当前的内存使用百分比

1.编写脚本

#free -m 先查看一下内存使用情况
#vim memory.sh

#!/bin/bash
#free -m
mem_total=$(free -m | grep "Mem" | awk '{print $2}')
mem_used=$(free  -m | grep "Mem" | awk '{print $3}')
echo "当前内存总大小为$mem_total M"
echo "已使用$mem_used M"
echo "当前内存已使用百分比为$(expr $mem_used \* 100 / $mem_total )%"

 

 2.验证脚本

#. memory.sh 运行脚本;注:第一个点后面是有空格的

 注:这里有个疑问,查看内存使用情况的时候,used是575,打印出来就变成576了,这里表示不太理解。

5.示例五:管理员在登录系统时显示如下信息

1)当前系统的登录用户的数量
2)当前运行的进程数量
3)当前使用的磁盘根分区的使用情况

1.编写脚本

#vim sysinfo.sh

#!/bin/bash
#show sysinfo
echo "root disk used info :"
df -h | grep "/$" 

LoginCount=$(who | wc -l )
PsCount=$(expr $(ps -aux | wc -l ) - 1 )
RootDiskUsed=$(df -h | grep "/$" | awk '{print $5}' )

echo "当前登录系统的用户数量=$LoginCount"
echo "当前进程的数量=$PsCount"
echo "当前根分区已使用$RootDiskUsed" 

注:wc -l 意思是对结果集的行数进行计算

ps -aux 显示当前所有线程

df -h 查看当前磁盘挂载以及使用情况。 

 

2.验证脚本

#. sysinfo.sh

 

 3.在开机启动项,添加此脚本使之开机自动运行

   >给脚本赋予x执行权限,否则开机自动运行时会提示:bash: /root/myshell/sysinfo.sh: Permission denied  权限不足,被拒绝执行。 

#chmod  744 /root/myshell/sysinfo.sh 
或者
#chmod u+x /root/myshell/sysinfo.sh 给当前用户添加x执行权限

 >编辑开机自动运行脚本

#vim /root/.bash_profile 注:这个是一个隐藏的文件,ll -a 才可以看到

脚本内容

/root/myshell/sysinfo.sh 

 4.在Xshell中再次验证

exit 退出Xshell,重新登录Xshell,查看效果

6.示例六:写一个监控脚本,记录CPU负载、内存和交换空间、磁盘空间、最近的用户登录情况等信息,以及当时的时间信息。

1.编写脚本

#vim monitor.sh

 #!/bin/bash
CpuRec=`uptime`
MemRec=`free -m`
DiskRec=`df -hT`
LastUserLoginRec=`last -20`
RecTime=`date  +"%Y-%m-%d %H:%M:%S"`
mkdir -p /var/log/runrec
RecFile=/var/log/runrec/runing-$(date +%Y%m%d%H%M)
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Record Time:
$RecTime
Cpu Load information:
$CpuRec
Memory information :
$MemRec
Disk use information :
$DiskRec
Last login 20 users record :
$LastUserLoginRec "#>>$RecFile

 

注:这个案例里面的命令,都比较好理解,可以随意单独拿出来,看运行结果。其中

uptime 是看cup负载情况的 ;

最后一行“#>>$RecFile” 意思是把如上打印信息,输出到以时间命名的文件内(文件不存在则会自动生成)

2.验证脚本

#. monitor.sh 运行脚本
#cd /var/log/runrec 切换到日志目录
#ls 查看生成的日志文件列表

 3.编辑计划任务,使之每个小时执行一次

#crontab -e  打开计划任务编辑器

计划任务脚本内容 (脚本也比较简单:前面定义运行周期,依次用空格隔开,后面写脚本路径

* 1 * * * /root/myshell/moitor.sh
:wq 保存并退出。

 注:计划任何的执行时间,从前到后,依次是 分 、小时、日、月、星期(一个星期中的周几)。*代表不限具体某个对应时间。
具体说明可以输入命令:#vim /etc/crontab 查看计划任务的时间说明

 此时,每隔一个小时,就可以看到日志文件中多一个日志了。

本文含有隐藏内容,请 开通VIP 后查看