shell实战
1. 注意事项
- 开头加解释器
```
#!/bin/bash
# 以及相关注释说明
```
- 变量名大写、局部变量小写,函数名小写
- 遇到执行非0时退出脚本的命令:
```
set -e
```
- 打印执行过程的命令:
```
set -x
```
- 写脚本一定要先测试再上生产环境
2. 获取随机字符串或数字
-c,–characters=LIST select only these characters
2.1 获取8位字符串随机数
- MD5全程报文摘要算法,此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的报文摘要,不同的文件产生相同的报文摘要的可能性是非常小的
```
echo $RANDOM | md5sum | cut -c 1-8
cat /proc/sys/kernel/random/uuid | cut -c 1-8
```
2.2 随机8位数字随机数
cksum命令是确保文件从一个系统传输到另一个系统的过程中没有被损坏。这个测试要求校验和在源系统中被计算出来,在目的系统中又被计算一次,两个数字比较,如果校验和相等该文件被认为正确传输了
- %N 十亿分之一秒,纳秒[000000000, 999999999]
```
echo $RAANDOM | cksum | cut -c 1-8
date +%N | cut -c 1-8
```
3. 定义一个颜色输出字符串函数
- 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能
- 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示是033)
- 书写格式:
\033[显示方式;前景色;背景色m + 内容 \033]m
数值 |
含义 |
---|
0 |
默认值 |
1 |
高亮 |
22 |
非粗体 |
4 |
下划线 |
24 |
非下划线 |
5 |
闪烁 |
25 |
非闪烁 |
7 |
反显 |
27 |
非反显 |
前景色
数值 |
含义 |
---|
30 |
黑色 |
31 |
红色 |
32 |
绿色 |
33 |
黄色 |
34 |
蓝色 |
35 |
洋红 |
36 |
青色 |
37 |
白色 |
背景色
数值 |
含义 |
---|
40 |
黑色 |
41 |
红色 |
42 |
绿色 |
43 |
黄色 |
44 |
蓝色 |
45 |
洋红 |
46 |
青色 |
47 |
白色 |
echo -e "\033[m hello \033[m"
echo -e "\033[0;31;46m hello \033[m"
显示方式:正常 字体前景色:红色 背景色:青色
4. 批量创建用户
利用useradd 和 passwd
#!/bin/bash
USER_FILE=users.txt
for USER in user{1..5}; do
if ! id $USER &>/dev/null; then
PASS=$(echo $RANDOM | md5sum | cut -c 1-8)
useradd $USER
echo $PASS | passwd --stdin $USER &> /dev/null
echo -e "$USER\t$PASS" >> $USER_FILE
echo "$USER user create successfully."
else
echo_color red "$USER already exists.";
fi
done
5. 检查主机存货状态
#!/bin/bash
for IP in $@; do
if ping -c 1 $IP &>/dev/null; then
echo "$IP is ok."
else
echo "$IP is wrong!"
fi
done
6. 系统监控
6.1 系统命令
6.1.1 vmstat
- 借助vmstat工具来分析CPU统计信息
- vmstat(Virtual Memory Statics 虚拟内存统计)命令用来显示Linux系统虚拟内存状态,也可以报告关于进程、内存、I/O等系统整体运行状态
- vmstat[刷新延时 刷新次数]
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 2895176 138760 4284624 0 0 62 187 1 1 22 0 78 0 0
6.1.1.1 (procs)进程信息字段
分类 |
参数 |
含义 |
---|
procs |
r |
等待运行的进程数,数量越大,系统就越繁忙 |
procs |
b |
不可被唤醒的进程数量,数量越大,系统越繁忙 |
6.1.1.2 memory(内存信息字段)
分类 |
参数 |
含义 |
---|
memory |
swpd |
使用的Swap空间的大小,单位KB |
memory |
free |
空闲的内存容量,单位KB |
memory |
buff |
缓冲的内存容量,单位KB |
memory |
cache |
缓存的内存容量,单位KB |
6.1.1.3 swap(交换分区信息)
- 如果说si和so数越大说明数据经常要在磁盘和内存之间数据交换,系统性能就会越差
分类 |
参数 |
含义 |
---|
swap |
si(in) |
从磁盘中交换到内存中的数据的数量,单位KB |
swap |
so(out) |
从内存中交换到硬盘中的数据的数量,单位KB |
6.1.1.4 io(磁盘读写)
- bi和bo数越大,说明磁盘的I/O越繁忙
分类 |
参数 |
含义 |
---|
io |
bi(in) |
从块设备读入数据的问题,单位是块 |
io |
bo(out) |
写到块设备的数据的总量,单位是块 |
6.1.1.5 system(系统信息字段)
- in和cs数越大,说明系统与接口设备的通信越繁忙
分类 |
参数 |
含义 |
---|
system |
in(interrupt) |
每秒被中断的进程次数 |
system |
cs(switch) |
每秒钟进行的事件切换次数 |
6.1.1.6 CPU(CPU信息字段)
分类 |
参数 |
含义 |
---|
CPU |
us(user) |
非内核进程消耗CPU运算时间的百分比 |
CPU |
sy(system) |
内核进程消耗CPU运算时间的百分比 |
CPU |
id(idle) |
空闲CPU的百分比 |
CPU |
wa(wait) |
等待I/O所消耗的CPU百分比 |
CPU |
st(steal) |
被虚拟机偷走的CPU百分比 |
6.1.2 free
- 查看内存使用状态
- free [-b|-k|-m|-g]
- -b 表示以字节为单位
- -k 表示以KB为单位
- -m 表示以MB为单位
- -g 表示以GB为单位
free -m
total used free shared buffers cached
Mem: 1006 687 319 0 98 449
-/+ buffers/cache: 139 866
Swap: 1999 0 1999
6.1.2.1 第一行
分类 |
含义 |
---|
total |
内存总数,total=used+free |
used |
已经使用的内存数 |
free |
空闲的内存数 |
shared |
多个进程共享的内存数,0,废弃,永远为0 |
buffers |
缓冲区内存数,buffer用于作为写入磁盘的内容缓冲区 |
cached |
缓存内存数,用于从磁盘中读取的内容缓存 |
6.1.2.2 第二行
- 用于指示应用程序看到的内存情况,也就是应用程序获取内存大小
参数 |
算法 |
含义 |
---|
- buffers/cache |
第一行的used-buffers-cached |
已经使用的要减去缓存和缓冲的内存量 |
+ buffers/cache |
第一行的free+buffers+cached |
空闲的要加上缓存和缓冲的内存量 |
6.1.2.3 第三行
分类 |
含义 |
---|
total |
swap总数,默认单位是K |
used |
已经使用的swap数,默认单位是K |
free |
空闲的swap数,默认单位是K |
6.1.3 查询网络状态
- netstat 选项
选项 |
含义 |
---|
-t |
列出TCP协议端口 |
-u |
列出UDP协议端口 |
-n |
不使用域名与服务名,而使用IP地址和端口号 |
-l |
仅列出在监听状态网络服务 |
-a |
列出所有的网络连接 |
netstat -tlun
netstat -an | more
netstat -unt | grep ESTABLISHED
ping
```
ping -c 1 www.baidu.com
```
- 在windows下,ping一个地址,默认发送四个数据包,linux下ping是不会自动终止的,需要按ctrl+c终止或用参数-c指定要求完成的回应此时
- 在官方 -c<完成次数> 来设置完成要求回应的次数
if后的[]
- if后面接 command list,可以是函数
- [后面只能是condition expression.
缓冲区与缓存区的区别
- 首先缓冲区跟缓存区都是内容内的。
- 所谓的缓冲区,就是当读取内存数据的时候,内容的数据会先放置在缓冲区,等缓冲区一定程度饱和,一起写入硬盘,所以可以提高读写的速度、减少磁盘IO操作、增加磁盘使用寿命
- 所谓的缓存区,就是如果需要不停地读取文件,原本需要从硬盘读取,那么读取一次后可以将文件放在缓存区内,下次读取的时候直接从缓存区拿就可以了,这是内存之间的读取,速度肯定快
查看网卡信息
- ifconfig
查看某块网卡的信息
- ifconfig 网卡名
```
ifconfig ens33
```
curl
```
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" http://www.baidu.com)
```
- -o 表示输出
- -o /dev/null 表示输出到null
- -s 表示默认状态,就是不打印日志
- -w 表示监控
- "%{http_code}" 表示获取头部状态码
- HTTP_CODE就是接收返回的http_code
curl 详解
grep -v xxx
- cat a.txt | grep -v "grep"
- 表示对a.txt的结果进行过滤,不要含有"grep"的内容
- -v表示不要
wc
- 统计
- wc -l
- 表示只统计行数