目录
liunx系统中的进程
在 Linux 系统中,进程是正在运行的程序的实例。每个进程都是系统资源的拥有者,包括内存、文件描述符、文件系统和其他运行时资源。Linux 操作系统使用进程作为管理和调度任务的基本单位,以实现多任务处理和资源隔离。
进程标识符(PID):每个进程在系统中都有一个唯一的标识符,称为进程标识符(PID)。PID 是一个正整数,用于在系统中唯一标识一个进程。
状态:进程可以处于不同的状态,包括==运行(Running)、就绪(Ready)、阻塞(Blocked)==等。操作系统根据进程的状态进行进程调度和资源管理。
进程控制块(PCB):每个进程都有一个进程控制块(PCB),用于存储进程的状态信息、上下文和其他相关信息。PCB 包含进程的 PID、状态、程序计数器、寄存器等。
父子关系:进程可以通过创建子进程来执行不同的任务。每个进程都有一个父进程(除了初始化进程),linux7 pid为1 类似祖宗进程是systemd。
停止父进程,再杀死子进程,子进程会进入僵尸状态。(占用进程资源)
进程调度:Linux 操作系统使用调度算法来决定哪个进程获得 CPU 时间片并运行。调度算法的目标是提供公平的 CPU 分配,使得所有进程都有机会获得 CPU 时间。
进程间通信:Linux 提供了多种进程间通信(IPC)机制,包括管道、消息队列、共享内存、信号量等,用于进程之间的数据传递和共享。
进程资源管理:Linux 操作系统使用进程的优先级、调度策略和资源限制来管理系统资源的分配,以确保系统的稳定性和性能。
前台进程和后台进程:前台进程是在终端中运行的进程,可以与用户交互;后台进程是在后台运行的进程,不与用户交互,可以继续在终端中执行其他任务。
- 命令 加 & 放入后台
- jobs 后台执行的命令 查看列表、编号
- fg 加编号 把任务调回前台
- ctrl +z 把命令放回后台任务 但是 是停止状态
- bg 加编号 重新开始后台任务
切换到前台运行作业:
fg %2
切换到后台继续运行作业:
bg %2
kill 命令的相关知识看进程管理
进程、线程、协程
进程(Process):
进程是计算机中的基本执行单元,每个进程都有自己独立的地址空间和系统资源,如内存、文件描述符等。
进程之间相互独立,不共享内存空间,需要通过进程间通信(IPC)来进行数据交换。
进程切换开销较大,因为需要切换整个进程的上下文信息。
进程之间可以并发执行,适合在多核系统上利用多核资源。
线程(Thread):
线程是进程的一部分,多个线程共享同一个进程的地址空间和系统资源。
线程之间共享内存,可以直接读写进程中的全局变量,因此线程间通信较为方便。
线程切换开销较小,因为只需要切换线程的上下文信息,不需要切换整个进程。
线程之间可以并发执行,适合在多核系统上利用多核资源。
协程(Coroutine):
协程是一种轻量级的线程,由用户控制调度,而不是由操作系统调度。
协程是在同一个线程中运行的,不需要切换线程上下文,因此切换开销极小。
协程之间共享状态,可以直接访问彼此的数据,但不会导致资源竞争。
协程一般在一个线程中顺序执行,可以用于编写高效的并发代码,适用于 I/O 密集型任务。
总结:
进程适合处理资源独立的任务,各个进程之间独立运行,需要通过 IPC 进行通信。
线程适合在一个进程中并发执行任务,各个线程共享进程的资源,可以直接读写进程内的数据。
协程适合编写高效的并发代码,由用户控制调度,不需要线程切换开销,适用于 I/O 密集型任务。
进程状态
进程的基本状态
- 创建状态(Created):进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态(Ready):进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态(Running):进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态(Blocked):正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态(Terminated):进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
- 挂起(Suspended):进程处于挂起状态,暂时不会被调度执行,可以通过某些操作重新恢复。
进程在运行过程中会根据不同的情况发生状态的转换,这些转换是动态的,可以理解为进程的生命周期。下面是进程状态之间转换的一些常见情况:
- 创建 -> 就绪:当进程被创建后,系统为其分配资源并将其放入就绪队列等待调度。
就绪 -> 运行:当系统调度器选择了某个就绪进程并分配 CPU 给它时,进程由就绪状态转换为运行状态。
运行 -> 阻塞:当进程发起某些 I/O 操作或等待某个事件时,它可能会由于等待而被挂起,转换为阻塞状态。
阻塞 -> 就绪:当进程等待的事件发生,例如 I/O 完成,它会从阻塞状态转换回就绪状态。
运行 -> 终止:当进程完成了它的任务或者因为某个原因被终止,它会从运行状态转换为终止状态。
就绪/运行/阻塞 -> 挂起:当进程被挂起,暂时不会被调度执行,可以通过某些操作(如恢复信号)将其恢复为原来的状态。
进程分类
-
前台进程和后台进程:
前台进程:在终端中运行的进程,会向终端输出信息,同时可以接收终端的输入。
后台进程:在终端中运行,但不会向终端输出信息,通常用 “&” 将命令放到后台执行。 -
交互式进程和批处理进程:
交互式进程:与用户交互并接受用户输入,通常在终端中运行,并等待用户输入指令。
批处理进程:无需用户干预,自动执行一系列指令,通常通过脚本文件实现。 -
前台线程和后台线程:
前台线程:在进程的前台运行,可以与其他线程共享同一进程的资源。
后台线程:在进程的后台运行,通常用于执行后台任务,不会影响前台线程的执行。 -
实时进程和普通进程:
实时进程:
具有实时性要求的进程,优先级较高,通常用于响应性要求较高的任务。
普通进程:没有实时性要求,根据系统调度策略进行调度。
守护进程:
守护进程是在后台运行的特殊进程,通常在系统启动时启动,没有终端连接,独立于用户登录。
守护进程负责在后台执行特定的系统任务,如网络服务、日志记录等。
孤儿进程和僵尸进程: -
孤儿进程:父进程退出后,子进程还在运行,但其父进程已不存在,此时操作系统将它的父进程设置为 init 进程。
僵尸进程:子进程退出后,其退出状态还未被父进程处理,此时子进程被称为僵尸进程。 -
可中断进程和不可中断进程:
可中断进程:可以响应信号,如终止信号,可以被中断或终止。
不可中断进程:不能被中断或终止,通常用于处理关键任务,如 I/O 操作。
linux系统中和进程相关的命令
以下命令来查看进程的相关信息:
- ps:用于显示当前正在运行的进程状态。
- ps aux:显示所有用户的所有进程信息。
- ps -ef:与 ps aux 类似,但输出格式稍有不同。
- ps -e:显示当前系统中所有的进程。
- ps -l:显示进程的详细信息,包括进程状态、CPU 占用率等。
- ps -p :显示指定进程 ID (PID) 的详细信息。
- top:实时显示系统中进程的状态和资源占用情况。
- 在终端中输入 top 命令,将显示按 CPU 占用率排名的进程列表,以及系统的负载情况。
- htop:类似于 top,但提供更加友好的交互式界面。
- 需要先安装 htop,然后在终端中输入 htop 命令。
- pstree:以树状图形式显示进程之间的关系。
- 在终端中输入 pstree 命令,将显示当前系统的进程树。
- top、htop 和 pstree 命令可以用 q 键退出。
以下命令来查看五大性能指标,也称为“五个大类”:
- CPU 使用情况:
- top:实时显示系统中进程的 CPU 占用情况,按 CPU 使用率排序。
- htop:类似于 top,提供更友好的交互式界面,实时显示 CPU 使用率和进程信息。
- mpstat:显示 CPU 的平均使用情况和每个核心的使用情况。
- sar:系统资源历史报告,可以用于查看 CPU 使用率的历史数据。
- 内存使用情况:
- free:显示系统内存的使用情况,包括总内存、已用内存、空闲内存、缓存等。
- vmstat:显示虚拟内存的统计信息,包括内存使用情况、交换空间使用情况等。
- 磁盘 I/O 情况:
- iostat:显示 CPU 和设备 I/O 统计信息,包括磁盘和其他块 设备的使用情况。
- iotop:实时显示磁盘 I/O 的信息,按磁盘读写速度排序。
- 网络使用情况:
- ifconfig:显示网络接口的配置信息,包括 IP 地址、子网掩码、网关等。
- netstat:显示网络连接和路由表等信息。
- nload:实时显示网络流量的信息,按网络接口排序。
- 进程状态和负载情况:
- ps:显示当前正在运行的进程状态。
- top 或 htop:实时显示系统中进程状态和资源占用情况,包括 CPU 占用率、内存使用率等。
- uptime:显示系统的负载情况,包括 1 分钟、5 分钟和 15 分钟的负载平均值。
系统版本: cat/etc/redhat-release
ip地址 : ifconfig
内核版本: uname -r
DNS: cat /etc/resolv.conf
网关: route -n (ip地址) / ip route
vmstat 动态监控系统资源
#vmstat [-a] [刷新延时 刷新次数]
#vmstat [选项]
.
#vmstat 1 3
#使用vmstat检测,每隔1秒刷新一次,共刷新3次
查看进程的相关命令
PS命令
ps 即 process state,可以查看进程当前状态的快照(查看静态的进程统计信息),默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的文件中
格式:ps [options]
相关选项:
命令格式 | 说明 | 示例示例 |
---|---|---|
ps | 显示当前用户的所有进程信息 | ps |
ps aux | 显示所有进程的详细信息,与 -ef 类似,但输出格式略有不同 | ps aux |
ps -ef | 显示所有进程的详细信息,包括用户、进程ID、父进程ID、CPU 占用率等 | ps -ef |
-f: | 使用完整的(Full)格式显示进程信 | |
ps -l | 长格式显示进程信息,包括进程状态、优先级等 | ps -l |
ps -u username | 显示指定用户的进程信息 | ps -u username |
ps -p pid | 显示指定进程ID的信息 | ps -p pid |
ps k -%cpu | 根据 CPU 占用率对进程排序(倒序) | ps aux k -%cpu |
ps o | 属性… 显示定制的信息,可以指定要显示的属性,例如 pid、cmd、%cpu、%mem 等 | ps aux o pid,cmd,%cpu,%mem |
示例:
查看用户名为lisi的进程
#ps -u lisi aux 或者 pgrep -l -U lisi
.
查看进程的特定属性
#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 -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
找到未知进程的执行程序文件路径
#ps aux k -%cpu |head
#ll /proc/26314/exe
#touch a;chattr +i a
top命令
top命令是一个用于查看系统实时进程和系统资源使用情况的命令。它会动态地显示当前运行的进程列表,并实时更新各个进程的资源占用情况,包括CPU使用率、内存使用率、进程ID、运行时间等。
上面的输出包含了以下信息:
上半部分:
- 服务器运行时间和负载平均值。(任务队列信息)
- 进程相关统计信息,包括运行中的进程、睡眠中的进程、停止的进程等。(进程信息)
- CPU使用率信息,包括用户态、系统态、空闲时间等。(CPU信息)
- 内存使用情况,包括总内存、可用内存、缓存和交换空间等。(物理内存信息)
- 运行中的进程列表,包括进程ID、用户、CPU使用率、内存使用率、运行时间和进程命令等。(交换分区(swap)信息)
缓冲(buffer)和缓存(cache)的区别:
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
下半部分:
- PID:进程的 ID。
- USER:该进程所属的用户。
- PR:优先级,数值越小优先级越高。
- NI:优先级,数值越小、优先级越高。
- VIRT:该进程使用的虚拟内存的大小,单位为 KB。
- RES:该进程使用的物理内存的大小,单位为 KB。
- SHR:共享内存大小,单位为 KB。
- S:进程状态。
- %CPU:该进程占用 CPU 的百分比。
- %MEM:该进程占用内存的百分比。
- TIME+:该进程共占用的 CPU 时间。
- COMMAND:进程的命令名。
按q键退出top命令。
选项 | 描述 |
---|---|
-d <秒数> | 指定刷新间隔时间,即每隔多少秒更新一次数据。 |
-n <次数> | 指定更新数据的次数后自动退出。 |
-b | 以批处理模式运行,将输出结果保存到文件而不显示在终端上。 |
-c | 显示完整的命令行,包括路径和参数。 |
-i 或 --ignore-case | 在排序时忽略大小写。 |
-o <排序字段> | 按指定的字段进行排序,例如 %CPU、%MEM、TIME+ 等。 |
-p <进程ID> | 显示指定进程ID的详细信息。 |
-u <用户名> | 只显示指定用户名的进程。 |
-U <用户名> | 只显示指定用户名的进程,并且不显示其他用户的进程。 |
H | 在显示进程时,将子进程也一并显示出来。 |
Z | 显示僵尸进程信息。 |
k | 向指定的进程发送信号以进行操作,例如终止进程。 |
pgrep命令
pgrep 命令用于通过进程名或其他属性查找进程的进程ID(PID)。它可以根据进程名、用户、组、父进程ID、会话ID等条件来搜索进程。pgrep 命令常用于通过进程名查找进程的PID,并与其他命令结合使用,例如 kill 命令来结束指定进程。
相关选项:
选项 | 描述 |
---|---|
-a | 显示完整的命令行,包括路径和参数。 |
-l | 显示与进程ID相对应的进程名。 |
-u <用户名> | 显示指定用户名的进程。 |
-U <用户名> | 显示指定用户名的进程,并且不显示其他用户的进程。 |
-g <组名> | 显示指定组名的进程。 |
-G <组名> | 显示指定组名的进程,并且不显示其他组的进程。 |
-s <会话ID> | 显示指定会话ID的进程。 |
-t <终端名称> | 显示指定终端名称的进程。 |
-P <父进程ID> | 显示指定父进程ID的进程。 |
-n | 显示最新的进程ID(PID),即显示最近创建的进程ID。 |
-o | 显示最旧的进程ID(PID),即显示最早创建的进程ID。 |
-x | 显示与指定条件完全匹配的进程。 |
-d <分隔符> | 指定输出时的分隔符,例如使用逗号 , 或空格来分隔多个PID。 |
示例:
显示进程名
pgrep -l “log”
.
指定用户
pgrep -l -U zhangsan
.
pidof #根据进程名 来找pid号
pstree进程树
pstree 命令用于显示当前系统中运行的进程树,以树状结构展示进程之间的关系。它可以帮助你更直观地了解进程之间的层级关系,包括父进程、子进程和兄弟进程。
pstree [OPTION] [ PID | USER ]
常用选项
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程
#查看用户名为 “john” 的进程树:
pstree -u john
.
#查找包含 “nginx” 关键字的进程树
pstree | grep nginx
.
#查看进程号为1的进程
pstree 1
.
#高亮
pstree -pH 1780
#查询系统中所有进程调用的文件
#lsof | more
查看内存的相关命令
free
free 命令用于显示系统的内存使用情况,包括物理内存和交换空间(虚拟内存)。它显示系统中的内存总量、已使用内存、空闲内存以及缓存和缓冲区的使用情况。
运行 free 命令时,输出会包含以下信息:
- total: 总的物理内存大小。
- used: 已使用的物理内存大小。
- free: 空闲的物理内存大小。
- shared: 被共享使用的物理内存大小。
- buff/cache: 缓存和缓冲区使用的物理内存大小。
- available: 系统当前可用的物理内存大小。
- swap: 交换空间的使用情况。
- total: 总的交换空间大小。
- used: 已使用的交换空间大小。
- free: 空闲的交换空间大小。
查看磁盘剩余量的命令
df
lsblk
- NAME: 块设备的名称。
- MAJ:MIN: 主设备号和次设备号。
- RM: 可移动设备(1 表示可移动,0 表示不可移动)。
- SIZE: 块设备的总大小。
- RO: 只读属性(1 表示只读,0 表示可读写)。
- TYPE: 块设备的类型。
- MOUNTPOINT: 块设备被挂载到的目录。
fdisk -l
fdisk -l 是用于列出系统中所有的磁盘和分区信息的命令。
查看磁盘读写性能
dd
- 测试磁盘读取速度:
- dd if=/dev/sda of=/dev/null bs=1M count=1000 - 测试磁盘写入速度:
- dd if=/dev/zero of=/tmp/testfile bs=1M count=1000
iostat
iostat 可以提供更丰富的IO性能状态数据
[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
iotop
iotop 是一个用于监视磁盘 I/O 活动的命令行工具。它类似于 top 命令,但专注于显示磁盘 I/O 的信息,可以帮助你了解哪些进程正在读取或写入磁盘以及它们的 I/O 活动情况。
查看cpu的相关命令
mpstat
#mpstat 1 3
#1秒 一次 看3次
- top 实时查看 ps 静态查看
查看网络的相关命令
iftop
iftop 是一个用于实时监视网络流量的命令行工具。它可以显示正在通过网络接口进出的数据流量,并按照流量的大小进行排序,以便用户可以快速了解网络上的数据传输情况。
运行 iftop 后,你将看到一个类似于 top 命令的实时网络流量监视界面。在界面中,你可以看到每个网络连接的源和目标 IP 地址、传输的数据大小、流量的方向、流量的速率等。
iftop -t 5 表示每 5 秒刷新一次。
计划任务
crontab周期
[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 -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
-
-
-
-
- 执行的任务
-
-
-