参考网站
参考文档
参考网站
C语言中文网
自制小程序
推荐电影:《模仿游戏》
shell介绍
## 什么是编程语言?
编程语言的本质就是一门语言,而语言是一种事物和另外一种事物用来沟通的介质
人=============》编程语言=============》计算机
##什么是编程
分为两个环节
1、想清楚做事的步骤
2、用一种计算机能听懂的语言(编程语言)表达出来
## 为何要编程?
为了让计算机帮人去做事,从而解放人力
## 什么是程序
程序就是一堆代码文件
## 什么是进程
进程是程序的运行过程,也可以说是操作系统干活的过程,因为是操作系统负责控制硬件来运行应用程序,进程是一个抽象的概念,反应事务运行状态的一种宏观的概念
ps:进程与进程之间的内存空间是'互相隔离'的
## 计算机体系的三层结构
应用程序
操作系统
计算机硬件
## 什么是shell
shell是一门编程语言,用来与计算机沟通,从而控制计算机的
## 什么是shell解释器
用于解释执行shell语言语法/命令的一个'应用软件'
[root@Centos7 ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
## 什么是shell script
用shell这门编程语言编写的程序
## 运行shell程序两种方式
方式一:交互式环境(登录用户之后默认就会进入用户的shell解释器交互式环境)
优点:输入命令立即拿到代码的运行结果,即时运行
缺点:无法永久保存代码,退出交互式环境,代码全部丢失
方式二:把代码写到文件中,然后运行
优点:可以永久保存代码,以便后期重复使用
缺点:无法即时运行
编程语言分类
机器语言:直接使用二进制指令去编写程序
问题:
1、二进制指令难以记忆
2、开发复杂:实现一个简单的操作都需要很多条指令才能完成
汇编语言:用英文标签替代机器语言的二进制指令编写程序
解决的问题:不用记忆二进制指令
存在的问题:开发仍然比较复杂
高级语言:用人类能理解的表达方式去编写程序
1、编译型(C语言,go语言):
2、解释型(shell、python):
执行效率:机器语言> 汇编语言>高级语言(编译型>解释型)
开发效率:机器语言<汇编语言<高级语言
程序和进程
进程:进程就是把硬盘中的代码拿出来,放到内存中运行的过程
变量的调用:就是通过变量名对应的内存中的'内存地址',调用变量值的过程
#僵尸进程
#linux系统父子进程涉及:父进程记录子进程的状态,pid 内存等资源占用
#系统所有的进程都会先进入僵尸进程,子进程运行结束后父进程回收子进程占用的资源,但是会保留其PID,子进程脱离僵尸状态
#父进程活着,子进程死了,但是由于父进程的原因,子进程占用资源没有被回收,那么该子进程被称为僵尸进程
#父进程死了,但是其子进程还活着,该子进程成为孤儿进程,被systemd进程回收,子进程继续工作,然后死去,资源被systemd回收
#子进程结束运行,才会被标记为僵尸进程标签,父进程看到该标签会立即回收其资源,如果不回收,那么,该子进程才会被系统认为是真正的僵尸进程
#僵尸进程过多,会导致系统PID被占满
#但是一般在系统看不到进程进入僵尸状态,僵尸进程出现原因:
1.父进程回收子进程资源太慢,kill -CHLD ,向父进程发送回收子进程资源的信号
2.父进程假死,kill -9,杀死父进程
[root@hass-11 script]# ps aux|grep [Z]+
#进程的状态
进程的运行状态:运行态、就绪态、阻塞态
并发:看起来是同时运行的
并行:真正意义上的同时运行,只有'多核'才有并行的可能性
面试题
#取变量的字符长度
[root@hass-11 /]# a=123
[root@hass-11 /]# echo ${a}
123
[root@hass-11 /]# echo ${#a}
3
[root@hass-11 /]# echo ${a}|wc -L
3
[root@hass-11 /]# echo ${a}|awk "{print length}"
3
#切片(左切右不切)
[root@hass-11 /]# msg="hello world"
[root@hass-11 /]# echo ${msg:4}
o world
[root@hass-11 /]# echo ${msg::4}
hell
[root@hass-11 /]# echo ${msg:3:2}
lo
#截断(左右都截)
[root@hass-11 /]# echo ${url#www.}
baidu.com
[root@hass-11 /]# echo ${url#*.} #非贪婪
baidu.com
[root@hass-11 /]# echo ${url##*.} #贪婪
com
[root@hass-11 /]# echo ${url%.com}
www.baidu
[root@hass-11 /]# echo ${url%.*}
www.baidu
[root@hass-11 /]# echo ${url%%.*}
www
[root@hass-11 /]# echo $HOSTNAME
hass-11
#替换
[root@hass-11 /]# echo ${url/./}
wwwbaidu.com
[root@hass-11 /]# echo ${url//./}
wwwbaiducom
[root@hass-11 /]# echo ${url//./|}
www|baidu|com
[root@hass-11 test]# touch syy_2020_0{1..5}_linux.txt
[root@hass-11 test]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_01_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_02_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_03_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_04_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_05_linux.txt
[root@hass-11 test]# for fname in `ls .`;do mv $fname ${fname/_linux/};done
[root@hass-11 test]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_01.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_02.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_03.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_04.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_05.txt
$变量名 == ${变量名}
${#变量名} :得到变量内容的字符长度
${变量名:2} :显示从变量第三个到最后的全部字符
${变量名:2:5}显示变量第三个到第五个变量
${变量名//被替换者/替换者} :用替换者去替换全部被替换者
${变量名/被替换者/替换者}:用替换者去替换第一个替换者
总结
[] #test
[[ 变量 =~ 正则表达式 ]]
#计算
$[]
$(())
直接数值运算
[root@hass-11 ~]# echo $[1+1]
2
[root@hass-11 ~]# echo $((1+1))
2
直接变量运算
[root@hass-11 ~]# a=1
[root@hass-11 ~]# b=2
[root@hass-11 ~]# echo $[a+b]
3
[root@hass-11 ~]# echo $((a+b))
3
#测试
()
$()
[root@hass-11 ~]# (umask 0000;mkdir /syy);ll /syy -d;umask
drwxrwxrwx 2 root root 6 Aug 27 09:32 /syy
0022
[root@hass-11 ~]# mkdir www.baidu.com_$(date +%F-%M-%S)_.tar.gz
[root@hass-11 ~]# ll
drwxr-xr-x 2 root root 6 Aug 27 09:35 www.baidu.com_2020-08-27-35-26_.tar.gz
1. test 测试表达式
2. [ 测试表达式 ]
3. [[ 测试表达式 ]]
4. ((测试表达式))
注:
一:1、2、3方式中测试表达式两侧必须有至少一个'空格',4不用
二:1、2等价,3是test的扩展,'支持正则',4常用于计算
三:&&、||、<、>、应用于[[]]中,而不能在[]中,在[]中常用 -a 、-o 、-lt(用于整数)、-gt(用于整数)
#tee命令:
当使用文本重定向时,文字会被重定向到文本文本中,而屏幕中没有显示,此时,若要屏幕中也显示的话就用
tee命令,而tee命令的前一个命令错误输出不会被tee读取,#管道
tee -a file1 :文件file1没有则创建,有则增加内容到后面,而不是覆盖 # -a
tee file1 file2 :同时将文本添加到file1 和file2里面
监控
1.服务器本地监视
netstat -pantu | grep 80| wc -l :过滤关键字端口,转化为数字
netstat -pantu | grep nginx | wc -l :过滤关键字进程,转化为数字
ss -pantu | grep 80 | wc -l
lsof -i tcp:80 | wc -l
2.远端监控服务器端口
1.nmap 127.0.0.1(自己服务器ip) -p 80 | grep open | wc -l
2.nc -w 2 127.0.0.1 80 &>/dev/null -w表示超时时间
3.对服务进程或进程数进行监控
1.ps -ef | grep nginx | grep -v "grep" | wc -l
2.ps -C nginx --no-header
4.在客户端模拟用户访问的监控方式,#测试链接是否正常
wget --spider --timeout=10 --tries=2 www.baidu.com &>/dev/null
--spider #加了该参数,wget命令就不会下载
--timeout #设置检测时间
--tries #设置检测次数
-q #静默模式,不输出结果
#!/bin/bash
count=1
read -p "请输入要检测的URL: " url
while true;do
if [ $count = 4 ];then
break
else
echo "正在进程第${count}次检测..."
wget --spider --timeout=10 -q --tries=2 $url
((count++))
fi
done
free
[root@hass-11 ~]# free
total used free shared buff/cache available
Mem:(物理内存) 2028116 198164 1269216 9824 560736 1632264
Swap: 1048572 0 1048572
#单位为k
#总大小 已用 剩余 共享内存(管道 队列等)
#cpu 真正的运行数据
#内存 暂时存储数据,存取速度快
#磁盘 存储数据,平均磁道时间(目前是5毫秒),平均延迟时间(要考虑磁头转速)
#cache 作用于CPU再次读取磁盘中的数据
#buffer 作用于CPU把新产生的数据存储到内存,再存储到硬盘
#linux系统会把多余的内存用于别的地方,比如buff/cache
#shared 用过的内存中哪些是共享的
#available 开启新的进程,可以使用的总内存
total = used + free + buff/cache
#把buff中的数据存储到磁盘
[root@hass-11 ~]# sync
#清理buff/cache中的空间,一般用于大量开启进程之前执行
[root@hass-11 ~]# echo 3 > /proc/sys/vm/drop_caches
三剑客
1.grep
过滤文本,可以直接接受管道输入
2.sed
非交互编辑文本,与xargs配合才能接受管道输入
3.awk
编辑列,与xargs配合才能接受管道输入
内存 固态 机械
#对于读写速度
内存 > 固态硬盘 > 机械硬盘。机械硬盘是靠电机带动盘片转动来读写数据的,而内存条通过电路来读写数据,电机的转速肯定没有电的传输速度(几乎是光速)快。虽然固态硬盘也是通过电路来读写数据,但是因为与内存的控制方式不一样,速度也不及内存。
#加载器
不管是运行QQ还是编辑Word文档,都是先将硬盘上的数据'复制'到内存,才能让CPU来处理,这个过程就叫作载入内存(Load into Memory)。完成这个过程需要一个特殊的程序(软件),这个程序就叫做加载器(Loader)
#buffer
CPU直接与内存打交道,它会读取内存中的数据进行处理,并将结果保存到内存。如果需要保存到硬盘,才会将内存中的数据复制到硬盘,这里暂时保存数据的内存空间叫做"buffer缓冲区"
#cache
CPU通知内存,要调用磁盘中的数据,内存从磁盘中取出数据,放到内存,这里暂时保存数据的内存空间叫做"cache缓冲区"
虚拟内存
#原理
当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,"硬盘"中就会有一部分空间用来"存放内存中暂时不用的数据"。这一部分空间就叫做虚拟内存(Virtual Memory)
#缺点
硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间,所以如果你的内存太小,会严重影响计算机的运行速度,甚至会出现”卡死“现象