进程、线程和协程
进程是程序的执行实例
线程是进程的执行路径
协程是基于线程之上但又比线程更加轻量级的存在
进程与线程的区别
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
进程和程序的区别
程序:执行特定任务的一串代码,静态的存放在硬盘上的
进程:运行中的程序,是有生命周期的
开启会消耗硬件资源,如果不关注轻则卡顿重则死机
五大性能
内存使用率 | free,top |
---|---|
cpu使用率 | w,top,ps,iostat,uptime |
硬盘使用率 | df |
硬盘读写性能 | dd,iostat |
网络带宽 | iftop |
进程优先级
在linux中,表示优先级的有两个参数Priority和Nice
其中,PRl代表Priority,NI代表Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI和NI的关系如下
PRI (最终值) = PRI (原始值) + NI
ps axo pid,cmd,ni
#查看
[root@centos8 ~]#nice -n -10 ping 127.0.0.1
[root@centos7 ~]#renice -n -20 2118
修改NI值时有几个注意事项:
-
NI值的范围是-20~19
-
普通用户调整NI值的范围是0~19,而且只能调整自己的进程。
-
普通用户只能调高NI值,而不能降低。如原本NI值为0,则只能调整为大于0。
-
只有root用户才能设定进程NI值为负值,而且可以调整任何用户的进程。
#查看进程的特定属性 ps axo pid,cmd,%mem,%cpu #按CPU利用率倒序排序 ps aux k -%cpu #模拟cpu忙 dd if=/dev/zero of=/dev/null #排序,查找占用最多内存和CPU的进程 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head #按内存倒序排序 ps axo pid,cmd,%cpu,%mem --sort %mem 查看进程信息 prtstat #prtstat 18395
管理进程
开启进程消耗硬件资源(内存 硬盘 cpu使用率),硬件资源消耗完了,卡顿 死机
进程消耗相应的资源 cpu利用率 内存使用率 磁盘使用率
进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
进程更多的状态:
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程
进程之间通讯
pipe 管道,单向传输
socket 套接字 不同主机间程序的通信
操作系统分类:
- 协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用
- 抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,+操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务
进程类型:
- 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
- 前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
按进程资源使用的分类:
- CPU-Bound:CPU 密集型,非交互
- IO-Bound:IO 密集型,交互
命令
ps aux |grep Z
过滤僵尸进程
pgrep=ps aux |grep
过滤进程
-u指定用户
ps 查看静态的进程统计信息
ps aux | 可以查看系统中的所有进程 |
---|---|
ps -le | 可以查看系统中所有的进程,而且还能看到进程的父进程的PID和进程优先级 |
-f | 使用完整的(Full)格式显示进程信息 |
k|–sort 属性 | 对属性排序,属性前加-表示倒序 ps aux k -%cpu |
o 属性… | 选项显示定制的信息pid、cmd、%cpu、%mem |
ps aux 命令输出信息
表头 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID。 |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?代表和终端无关,系统进程 |
STAT | 进程状态。常见的状态有以下几种: -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 |
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
top 动态进程命令
-d 秒数 | 指定 top 命令每隔几秒更新。默认是 3 秒 |
---|---|
-b | 使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中 |
-n 次数 | 指定 top 命令执行的次数。一般和"-"选项合用 |
p 进程PID | 仅查看指定 ID 的进程 |
-s | 使 top 命令在安全模式中运行,避免在交互模式中出现错误 |
-u 用户名 | 只监听某个用户的进程 |
在top命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
?或h | 显示交互模式的帮助 |
---|---|
c | 按照CPU的使用率排序,默认就是此选项 |
M | 按照内存的使用率排序 |
N | 按照PID排序 |
T | 按照CPU的累积运算时间排序,也就是按照TIME+项排序 |
k | 按照PID给予某个进程一个信号。一般用于中止某个进程,信号9是强制中止的信号 |
r | 按照PID给某个进程重设优先级(Nice)值 |
q | 退出top命令 |
pgrep命令
查看指定的进程
-U | 指定用户名 |
---|---|
-l | 显示进程 |
-a | 显示完整格式的进程 |
-P pid | 显示指定进程的子进程 |
[root@test ~]# pgrep -l "log"
# 显示进程名
435 xfs-log/dm-0
713 xfs-log/sda1
790 xfs-log/md5
877 systemd-logind
885 abrt-watch-log
886 abrt-watch-log
890 rsyslogd
#指定用户
[root@test ~]# pgrep -l -U zhangsan
pidof
#根据进程名 来找pid号
pidof dd
uptime
[root@localhost ~]#uptime
10:36:45 up 5:02, 2 users, load average: 0.97, 0.50, 0.23
pstree
-p 显示pid号
[root@test ~]# pstree 1
#显示进程号为1的进程
[root@test ~]# pstree lisi
#查看用户lisi的进程
[root@test ~]# pstree -pH 1708
#高亮
lsof 列举出系统中已经被打开的文件
选项 | 功能 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件。 |
+d 目录名 | 列出某个目录中所有被进程调用的文件。 |
-u 用户名 | 只列出某个用户的进程打开的文件。 |
-p pid | 列出某个 PID 进程打开的文件。 |
#查询系统中所有进程调用的文件
[root@localhost ~]# lsof | more
误删文件可以找回
有人在使用
lsof |grep delete
cupsd 1144(pid) root 10r REG 253,0 2337 9381005 /etc/passwd+ (deleted)
ll /proc/1144/fd
fd 是文件描述符
[root@localhost data]#ll /proc/1144/fd
总用量 0
lr-x------. 1 root root 64 11月 29 11:26 0 -> /dev/null
lrwx------. 1 root root 64 11月 29 11:26 1 -> socket:[20288]
lr-x------. 1 root root 64 11月 29 11:26 10 -> /etc/passwd+ (deleted)
lrwx------. 1 root root 64 11月 29 11:26 11 -> socket:[24022]
lrwx------. 1 root root 64 11月 29 11:26 12 -> socket:[24023]
cat /proc/1144/fd/10
服务器运行了3天非常卡,缓存满了需要清理
echo 3 > /proc/sys/vm/drop_caches
buff/cache共享缓存空间
内存独立出部分空间用于存取缓存数据,当满足系统设定的条件后自动将数据存放至硬盘中。
free -h可以查看buff/cache占用情况
如何清理缓存
free -h
free -m #以m为单位查看
cd proc/sys/vm #找到缓存路径
ls #查看vm文件夹下的文件或文件夹
cat drop_caches #查看缓存文件夹内容
pwd #查看当前文件夹路径
echo 3 >/proc/sys/vm/drop_caches
监控系统资源 虚拟 资源 vmstat
[root@localhost ~]# 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 1301648 2116 396752 0 0 38 3 33 33 0 0 100 0 0
下表罗列出了 vmstat 命令的第二种基本格式中常用的选项及各自的含义。
选项 | 含义 |
---|---|
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
-S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | 列出硬盘有关读写总量的统计表。 |
-p 分区设备文件名 | 查看硬盘分区的读写情况。 |
字段 | 含义 |
---|---|
procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。-buff:缓冲的内存容量,单位为 KB。-cache:缓存的内存容量,单位为 KB。 |
swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。 |
system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。这两个数越大,代表系统与接口设备的通信越繁忙。 |
cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
iostat
iostat 可以提供更丰富的IO性能状态数据
此工具由sysstat包提供
常用选项:
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
例子:
[root@localhost ~]#iostat 1 -d /dev/sda
#只看 sda硬盘
Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2023年07月27日 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 288.01 19561.04 7282.13 27750860 10331013
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.00 8.00 0.00 8 0
监视磁盘I/O iotop(需要额外安装)
iotop
dd if=/dev/zero of=/dev/null
iftop -ni ens33
#网络流量
网页客户端
wget https://prdownloads.sourceforge.net/webadmin/webmin-1.955-1.noarch.rpm
yum -y install webmin-1.955-1.noarch.rpm
service webmin start
ss -ntl
默认用户:root 密码:123123
uptime 系统运行了多久时间
[root@localhost ~]#uptime
01:29:00 up 2:07, 6 users, load average: 0.00, 0.01, 0.05
当前时间 运行时间 登录用户
系统资源统计
yum install dstat -y
webadin
官网:http://www.webmin.com/
yum install webmin-2.100-1.noarch.rpm -y
rpm -q webmin
systemctl start webmin
systemctl status webmin
https://192.168.91.100:10000/
root
自己系统的密码
手动启动进程
前台执行:会影响当前的操作
后台执行:不会影响当前的操作
命令 & | 将前台命令放入后台执行 |
---|---|
命令 ctrl+z | 将运行中的前台命令放入后台挂起 |
jobs | 后台任务列表,会显示序号 |
bg 序号 | 继续运行后台的命令 |
fg 序号 | 调出后台任务 |
并行执行任务
[root@localhost ~]#ping 127.0.0.1&ping 127.0.0.2&ping 127.0.0.3&
killall ping
screen
nohup ping 127.0.0.1
#!/bin/bash
host="192.168.91."
for i in {1..254}
do
{
ping -c1 -w1 $host$i &>/dev/null && echo $host$i is up || echo $host$i is down
}&
done
wait
结束进程
kill
kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
kill [信号] PID
kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,读者可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号
1) SIGHUP 无须关闭进程而让其重读配置文件
2) SIGINT 中止正在运行的进程;相当于Ctrl+c 3) SIGQUIT 相当于ctrl+\ 9) SIGKILL 强制杀死正在运行的进程,可能会导致数据丢失,慎用!
9) 关电源 数据库 写
15) SIGTERM 终止正在运行的进程,默认信号
18) SIGCONT 继续运行
19) SIGSTOP 后台休眠
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出。 |
9 | KILL | 杀死进程,即强制结束进程。 |
11 | SEGV | 段错误。 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
[root@localhost data]#trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
计划任务
1.一次性计划任务:at
at [option] TIME
at [选项] [时间]
[HH:MM] [yyyy-mm-dd]
HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00
HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2023-10-20
HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该
项任务
now + 5 min
02pm + 3 days
格式 | 用法 |
---|---|
HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 |
Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 |
Noon(noon) | 代表 12:00 PM(相当于 12:00)。 |
Teatime(teatime)下午茶 | 代表 4:00 PM(相当于 16:00)。 |
英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 |
MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 |
now+时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。 |
2.周期性计划任务:crontab
[root@localhost ~]#systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-03-01 21:23:18 CST; 3h 28min ago
Main PID: 1067 (crond)
CGroup: /system.slice/crond.service
└─1067 /usr/sbin/crond -n
Mar 01 21:23:18 localhost.localdomain systemd[1]: Started Command Scheduler.
Mar 01 21:23:18 localhost.localdomain systemd[1]: Starting Command Scheduler...
Mar 01 21:23:18 localhost.localdomain crond[1067]: (CRON) INFO (RANDOM_DELAY will be scaled with facto...d.)
Mar 01 21:23:18 localhost.localdomain crond[1067]: (CRON) INFO (running with inotify support)
Hint: Some lines were ellipsized, use -l to show in full.
#################
crontab [选项] [file]
###############
选项 | 功能 |
---|---|
-u user | 用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
-e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 |
-l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 |
-r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 |
-i | 在删除用户的 crontab 文件时,给确认提示。 |
crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
在时间表示中,还有一些特殊符号需要学习
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
-(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
/(正斜线) | 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令。 |
每月的 1号 15号 30号
* * 1,15,30 * *
中午 12点 - 16点
* 12-16/2 * * *
每 半小时 执行 一次
30 * * * *
[root@localhost opt]#cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
创建计划任务
crontab -u zhnagsan -e
#注意权限
*/2 * * * * /usr/bin/cp /etc/passwd /opt/
#每两分钟执行脚本
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
*/2 * * * * /usr/bin/cp /etc/passwd /opt/
30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T`
30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 有问题 执行不了
在书写 crontab 定时任务时,需要注意以下几个事项:
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。