目录
一、程序与进程
(一)什么是程序
(二)什么是进程
(三)进程和程序的区别
(四)进程、线程、协程
二、查看进程状态
(一)进程状态的种类
(二)命令之-----ps
(三)命令之-----prtstat
(四)命令之-----top
(五)命令之-----pgrep
(六)命令之-----pstree
(七)命令之-----lsof
(八)命令之-----vmstat
(九)命令之-----free
(十)命令之-----iostat
(十一)命令之-----pmap
(十二)命令之-----pidof
三、进程管理
(一)进程的启动
(二)命令之------&、ctrl + z
(三)结束进程
1.命令之-----kill
信号1:SIGHUP
信号9:SIDKILL
信号15:SIDTERM
2.命令之-----killall
3.命令之-----pkill
四、计划任务
(一)命令之----at
(二)命令之-----crontab
程序在计算机科学领域中,指的是为完成特定任务而编写的指令序列。它是一组有序的计算机操作说明,这些说明以某种编程语言编写,并且可以被计算机系统解释或编译执行。
程序设计的目标是让计算机按照预定的方式处理数据、控制硬件设备以及实现复杂的逻辑功能。当一个程序运行时,它会占据内存空间,根据指令集进行计算和控制流程,从而完成诸如数值计算、文件操作、用户交互、网络通信等各种任务。
从更抽象的角度来看,程序不仅包括了计算机软件层面的具体代码,也涵盖了其背后的设计思想、算法实现及问题解决方案的整体框架。在现代操作系统环境下,程序还可以进一步划分为进程和线程等概念,用来描述程序执行过程中的实体及其并发行为。
进程(Process)是计算机操作系统中一个正在运行的程序实例,它是系统资源分配和调度的基本单位。在操作系统内核管理下,每个进程都有独立的内存空间、程序计数器(PC)、寄存器集合以及其他系统资源,如打开的文件描述符等。
1.内存空间:进程有自己的地址空间,使得不同进程之间互不影响,确保了数据的安全性和稳定性。
2.执行状态:进程可以处于运行态、就绪态、阻塞态等多种状态,由操作系统的进程调度器负责在不同状态间进行切换。
3.生命周期:进程有一个完整的生命周期,包括创建、执行、暂停、恢复、等待、终止等阶段。
4.并发执行:多任务环境下的多个进程可以并发执行,通过CPU时间片轮转机制实现看似同时处理多个任务的效果。
进程与程序的区别在于,程序是静态的、存储在磁盘上的指令集,而进程则是这些指令在系统中被加载并执行时的一个动态实体。同一程序可以启动多个不同的进程,各自拥有独立的数据和控制流。
进程(Process):
线程(Thread):
可以在proc目录下查看一个程序是单线程还是多线程
图中我们可以看到,蓝色的数字文件夹代表进程的PID号
我们随便找一个PID号查看一下
协程(Coroutine):
系统进程有五种不同的状态
1.R(运行):正在运行或在运行队列中等待。
2.S(中断):休眠中,在等待某个条件的形成或接受到信号
3.D(不可中断):收到信号不唤醒和不可运行,进程必须等待直到有中断发生。
4.Z:(僵死):进程已终止,但进程描述符存在,直到父进程调用 wait40系统调用后释放。
5.T:(停止):进程收到 SIGSTOP,SIGSTP,SIGTIN,SIGTOU 信号后停止运行。
语法:ps 【选项】
作用:静态查看进程的状态信息统计结果
选项:
常用选项
a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程信息。
-e:显示系统内的所有进程信息。
-l:使用长(Long)格式显示进程信息。
-f:使用完整的(Full)格式显示进程信
k|--sort 属性 对属性排序,属性前加 - 表示倒序 ps aux k -%cpu
o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
比如我们查看系统中所有的进程信息,并显示出该进程的用户名
那么需要输入ps aux
给大家总结一下信息栏上的字母代表的含义
USER | 进程的所有者 |
PID | 进程ID号 |
%CPU | 运算器占用率 |
%MEM | 内容占用率 |
VSZ | 虚拟内存使用量(单位是KB) |
RSS | 占用的固定内存量(单位是KB) |
TTY | 所在终端 |
STAT | 进程状态 |
START | 被启动的时间 |
TIME | 实际使用时间 |
COMMAND | 命令名称与参数 |
STAT进程状态。常见的状态有以下几种:
-D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从 2.6 内核开始无效)。
-X:死掉的进程(应该不会出现)。
-Z:僵尸进程。进程已经中止,但是还是占用硬件资源。
-<:高优先级(以下状态在 BSD 格式中出现)。
-N:低优先级。
-L:被锁入内存。
-s:包含子进程。
-l:多线程(小写 L)。
-+:位于后台。
如果不想看到所有的进程,只想查看一下当前登录产生了哪些进程,那只需使用 "ps -l" 命令
如果我们想看某一个用户的进程信息
那么需要输入ps aux | grep "^avaih"
查看用户时,需要加o选项显示用户名,再使用grep筛选
也可以指定参数查看,查看进程的特定属性输入ps axo pid,cmd,%mem,%cpu,use
比如只想看PID号CPU信息
我们可以输入 ps axo pid,%cpu进行查看
cpu排序查看
输入 ps aux k (-)%cpu :不加-表示从小到大排序;加-表示从大到小排序
内存排序查看
语法:prtstat 进程PID号
作用:查看进程信息
语法:top
作用:动态查看进程信息
行数 | 内容 | 说明 |
第一行top | 14:04:48 | 系统当前时间 |
up6:38 | 系统的运行时间.本机己经运行 6小时 38 分钟 | |
3 users | 当前登录了两个用户 | |
load average: 0.00,0.01,0.05 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) | |
第二行 Tasks | 200 total | 系统中的进程总数 |
2 running | 正在运行的进程数,2个正在运行 | |
198 sleeping | 睡眠的进程数 | |
0 stopped | 正在停止的进程数 | |
0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 | |
第三行Cpu(s) | 0.1 us | 用户模式占用的 CPU 百分比 个人用户开启的进程占用的 cpu 率 |
0.0 sy | 系统模式占用的 CPU 百分比 | |
0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 | |
99.9 id | 空闲 CPU 占用的 CPU 百分比 | |
0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 1 | |
0.0 hi | 硬中断请求服务占用的 CPU 百分比 | |
0.0 si | 软中断请求服务占用的 CPU 百分比 | |
0.0 st | st(steal time)意为虚拟程序占用 cpu 时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 | |
第四行 Mem | 1867048 total | 物理内存的总量,单位为KB |
815642 free | 空闲的物理内存数量 | |
815632 used | 己经使用的物理内存数量 | |
963888 buffchche | 作为缓冲的内存数量 | |
第五行Swap | 5238780 total | 交换分区(虚拟内存)的总大小 |
5225332 free | 空闲交换分区的大小 | |
13448 used | 已经使用的交换分区的大小 | |
813352 avail Mem | 作为缓存的交换分区的大小 |
top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:
- PID:进程的 ID。
- USER:该进程所属的用户。
- PR:优先级,数值越小优先级越高。
- NI:优先级,数值越小、优先级越高。
- VIRT:该进程使用的虚拟内存的大小,单位为 KB。
- RES:该进程使用的物理内存的大小,单位为 KB。
- SHR:共享内存大小,单位为 KB。
- S:进程状态。
- %CPU:该进程占用 CPU 的百分比。
- %MEM:该进程占用内存的百分比。
- TIME+:该进程共占用的 CPU 时间。
- COMMAND:进程的命令名。
我们可以在top界面进行排序查看
①P 键:根据CPU使用百分比大小进行排序
②M 键:根据驻留内存大小进行排序
③N 键:根据启动时间进行排序
④c 键:切换显示命令名称和完整命令行
⑤h 键:可以获得 top程序的在线帮助信息
⑥k 键:根据提示输入指定进程的 PID 号并按 Enter 键终止对应的进程
⑦q 键:退出 top 程序
⑧数字1 键:显示CPU个数和状态
语法:pgrep 【选项】 用户名
作用:查找某个用户的进程
选项:
-l: 显示进程名
-U:指定用户
-a:显示完整格式的进程名
-P: pid: 显示指定进程的子进程
注意:-U后面要跟用户名,而后再添加其他选项,或则把该选项放在最后,否则识别不了用户名。
如果我们想查看当前用户运行了多少程序,可以通过pgrep命令查看
语法:pstree 【选项】【用户名】
作用:以树形结构列出进程信息
选项
-a:显示完整信息
-u:列出对应用户名
-p:列出对应PID号
pstree -aup 以树形结构完整列出对应用户名及进程号
实验:解决僵尸进程
一个进程有父进程还有子进程,子进程结束,会将自己的数据交给父进程,但是父进程意外终端,子进程还在,数据无法交出,系统会认为该子进程还在运行。
我们来做个实验,首先模拟一个僵尸进程
可以看到,我们之前使用的kill命令杀死进程号56550时,并没有彻底杀死
上图可以发现,僵尸进程占用的CPU和内存,很小,用0表示,基本不会有什么影响,想要删除的话,需要重启进程,或者重新启动系统
实验二:如何快速找到cpu利用率过高的程序
首先,我们模拟内存占满
假设dd是一个病毒程序,如果我们只杀死进程,过一会,它还会重新启动,我们只能删除这个程序,这时候,我们需要找到它的绝对路径所在。通过PID号找到它
切换到该进程号的目录,查看exe链接文件指向位置,就是绝对路径,然后去删除它就可以了
语法:lsof 【选项】
作用:显示已经打开的文件、恢复误删除的文件
-c 字符串:只列出以字符串开头的进程打开的文件
+d 目录名:列出某个目录中所有被进程调用的文件
-u 用户名:只列出某个用户的进程打开的文件
-p pid :列出某个 PID 进程打开的文件。
查看一个用户的进程
输入:lsof -u 用户名
恢复误删除的文件
前提是有其它终端在占用这个文件
首先新建一个文件,并在里面输入一些内容
使用另一个终端打开它
现在来删除它
使用lsof命令,过滤出该文件的进程号
找到文件的路径
语法:vmstat 【选项】
作用:用于报告虚拟内存统计信息,包括物理内存、虚拟内存、进程、CPU活动等系统整体状态
选项:
-fs:
-f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
-S 单位:令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
字段 | 含义 |
---|---|
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 百分比 |
-d:列出硬盘有关读写总量的统计表。
-p 分区设备文件名:查看硬盘分区的读写情况。
还可以指定输出间隔时间和次数
语法:free 【选项】
作用:查看内存情况
选项:
-h:在输出结果中自动采用合适的单位进行显示(人类可读格式)
-t:在输出结果底部添加一行总和
-s:连续输出内存使用情况,每秒更新一次,直到手动停止(Ctrl+C)
语法:iostat 【选项】
作用:用于收集和报告CPU使用情况以及磁盘I/O统计信息
选项:
-c:显示CPU使用率统计。
-d:显示设备〈磁盘)使用状态
-t:在输出中包括时间戳
-x:在输出中包括扩展的磁盘指标
语法:pmap 进程号
作用:查看进程占用 内存的详细信息
语法:pdiof 程序名
作用:查询已知程序名不知道pid号
进程管理是操作系统的核心功能之一,它涉及到对计算机系统中运行的进程进行创建、调度、同步、通信、终止等一系列操作
进程需要手动启动,启动后一般分为前台和后台,之前我们说过程序前台运行和后台运行,前台运行会一直占用终端,直到运行结束,影响当前操作,那么把命令放入后台启动,会立即释放终端就会方便很多。
首先我们来运行两个程序
第一个命令通过&直接放到后台
第二个命令top动态查看进程状态,会影响当前操作,需要按ctrl +c结束,我们可以按ctrl +z,使命令停止并调到后台,可以通过jobs来查看
使用fg、bg调用前后台
fg job序号
bg job序号
终止作业:kill + %job序号
&还可以使命令并行执行
语法:kill 【参数、信号】 【进程ID号】
作用:kill 是用来向进程发送信号的命令。通过指定进程ID(PID),你可以指示操作系统停止、暂停或恢复进程。
可以通过kill -l 来查看信号都有哪些
下面,就挑一些常用的信号来讲解一下
该信号表示挂起信号,最初设计用于通知进程挂起并重新读取配置文件,现代应用通常将它用作重启服务的信号。
强制退出:kill -9 进程或任务的ID号
一旦发送给某个进程,该进程将立即被操作系统强行终止,没有机会执行任何清理操作或者保存状态信息。常被用来终止无响应或陷入死循环的进程
正常结束进程,最常用的终止信号,请求进程停止运行。接收到这个信号的进程通常会尝试清理资源并优雅地退出。是 kill 命令的默认信号。
一般会等待最后一个访问用户退出时结束任务,在执行15信号后不会再添加新的访问信息
语法:killall 【选项】【信号】 进程名
作用:结束该进程名的所有进程
-i:表示会寻问,-l:忽略大小写
用法与killall一致,都是通过进程名杀死进程
语法:at 时间
作用:用于安排一次性执行的任务。at命令主要用于安排在指定的未来某个时间点运行一次性的命令或脚本。
如果需要过几天是需要输入完整的时间,可以输入atq查看计划列表
语法:crontab 【选项】
作用:crontab是Linux系统中用于配置和管理定时任务的命令。通过crontab,用户可以定义计划在特定时间或周期性执行的任务
选项:
-e:编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
输入crontab -e 进入编辑界面
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
此次编辑内容意思为,每个月15号的12点30分会在/data下建立一个名字叫abk的文件
-l :显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r:从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件
在编辑界面里有一些符号有特殊的含义
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
-(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
/(正斜线) | 代表每隔多久执行一次。比如"*/10命令",代表每隔 10 分钟就执行一次命令。 |
在书写 crontab 定时任务时,需要注意以下几个事项:
1. 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
2.crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
3.在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易 让管理员混淆。
4.在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对 路径的命令会报错。