一、程序与进程的关系
1.1 程序与进程
- 程序:存放在磁盘上的静态可执行文件(代码+数据),本身不运行
- 进程:程序被加载到内存、由CPU执行的动态实例,是操作系统资源分配的最小单位
- 程序是静态的文件;进程是程序运行时的动态实体,拥有独立PID,占用系统资源。一个程序可以同时产生多个进程
1.2 父进程与子进程
- 父进程通过fork创建子进程;子进程拥有独立PID,集成父进程资源,内存采用写时复制;父进程负责回收子进程,父死则子金山城被systemd收养(命令实操查看:ps -ef,PPID列就是父进程)
核心要点
- 父进程调用 fork(),复制自身生成子进程;子进程会继承父进程大部分资源(内存、文件描述符等),拥有独立 PID。
- PID 关系:子进程有自己 PID;子进程的 PPID(父进程 ID)= 父进程 PID。
- 父子进程内存:fork 瞬间拷贝,之后各自独立,互不影响(写时复制 COW)。
- 父进程可以等待子进程退出(wait() / waitpid()),回收子进程资源;
- 如果父进程提前退出,子进程会被systemd(PID=1)收养。
两个特殊状态
- 僵尸进程:子进程退出,但父进程没有回收它的退出信息,残留进程描述符。
- 孤儿进程:父进程先退出,子进程被 PID=1 接管。
1.3 层次:进程>线程>协程
- 进程(资源容器):操作系统资源分配的最小单位,拥有独立内存空间,进程之间相互隔离;一个进程至少有一个线程
- 线程(进程里的执行单元):进程内CPU调度的最小单位,隶属于进程,同进程内所有线程共享进程的内存与资源;线程切换由操作系统内核完成,有一定开销
- 协程(线程内部手动切换到清凉任务):运行在线程内部,由应用代码在用户态实现的轻量级任务;操作系统干知不道协程,切换无需内核参与,开销极小,一个线程可承载多个协程
二、查看进程信息
2.1 ps:查看系统中的进程
- ps -ef:以标准格式显示所有进程
- ps -aux:显示所有进程,包括其他用户的进程
- ps -aux | grep [进程名]:通过管道符和grep命令过滤进程
2.2 ps 输出字段详解
| 输出字段 | 含义 | 大白话 |
|---|
| USER | 启动该进程的用户 | 谁开的这个程序 |
| PID | 进程编号 | 进程的身份证号,杀进程靠它 |
| %CPU | CPU 占用率 | 占了多少 CPU 算力 |
| %MEM | 内存占用率 | 占了多少内存 |
| VSZ | 虚拟内存 | 程序 "申请" 的内存(不一定是真用) |
| RSS | 物理内存 | 实实在在占的内存条空间 |
| STAT | 进程状态 | 这个进程正在干什么(重点) |
| START | 启动时间 | 什么时候开始跑的 |
| TIME | 累计 CPU 时间 | 一共占用了多少 CPU 时间 |
| COMMAND | 启动命令 | 是哪个命令把它拉起来的 |
STAT 进程状态
| STAT进程状态 | 含义 | 大白话 |
|---|
| R | Running 运行中 | 正在跑 / 准备跑 |
| S | Sleeping 睡眠 | 没事干在休息,叫一声就能起来 |
| D | 不可中断睡眠 | 正在读写磁盘,不能随便叫醒 |
| T | Stopped 停止 | 被暂停了,暂时不干活 |
| Z | Zombie 僵尸 | 程序结束了,但父进程没回收,占点资源 |
STAT 额外标记
| STAT额外标记 | 含义 | 大白话 |
|---|
| < | 高优先级 | CPU 优先给它分配时间,干活插队 |
| N | 低优先级 | 优先级低,CPU 有空才轮到它 |
| l | 多线程进程 | 这个程序开了多个线程(l 是 L 小写 L) |
| s | 会话首进程 | 是一组进程的老大(会话组长) |
| + | 前台进程 | 在终端前台运行,按Ctrl+C可以终止它 |
三、动态查看进程信息
3.1 top 命令:查看实时的进程和资源占用情况
常用快捷键
- P:按CPU使用率排序
- M:按内存使用量排序
- T:按时间顺序
- q:退出top
- 1:查看几个CPU
top 输出字段
| 输出字段 | 含义 |
|---|
| PID | 进程 ID(进程的身份证号) |
| USER | 启动该进程的用户 |
| %CPU | 进程占用的 CPU 百分比 |
| %MEM | 进程占用的内存百分比 |
| TIME+ | 进程累计使用的 CPU 时间 |
| COMMAND | 执行的命令 |
四、pgrep 命令查询进程信息
- -l:可同时输出对应的进程名以及PID
- -U:查询特定用户的进程
- -t:查询在特定终端运行的进程
五、pstree 命令以树形结构列出进程信息
- -p:同时列出对应的PID号
- -u:列出对应的用户名
- -a:列出完整的命令信息
六、进程的启动方式
| 分类 | 方式 | 含义 | 命令 / 写法 | 适用场景 |
|---|
| 手工启动 | 前台 | 终端被占用,程序跑完才能敲下条命令 | 直接输命令(默认) | 快速任务 |
| 后台 | 程序放后台跑,终端继续可用 | 命令末尾加 & | 耗时任务 |
| 调度启动 | 一次性 | 到指定时间执行一次 | at 时间 | 定时跑一次 |
| 周期性 | 按时间重复执行 | crontab | 每日备份 / 定时任务 |
七、进程前后台的调度
| 命令 / 快捷键 | 作用 | 大白话 |
|---|
| Ctrl+Z | 把前台正在跑的进程暂停,挂入后台 | 临时暂停任务,放到后台,任务停住不继续跑 |
| jobs | 查看当前终端里所有后台任务jobs -l 同时显示任务 PID | 查看后台有哪些暂停的任务,带任务编号 |
| bg 任务号 | 后台恢复运行(Background) | 把暂停的后台任务,在后台继续跑 |
| fg 任务号 | 切回前台运行(Foreground) | 把后台任务拿回前台,终端继续等待它执行 |
八、kill:终止进程的运行
| 命令 / 快捷键 | 作用 | 说明 | 示例 |
|---|
| Ctrl+C | 中断前台进程 | 直接结束当前前台正在跑的程序 | 前台执行命令时按 Ctrl+C |
| kill PID | 优雅终止进程(信号 15) | 给进程发退出通知,进程做完收尾工作再关闭,优先使用 | kill 1234 |
| kill -9 PID | 强制杀死进程(信号 9) | 立刻强行干掉,不给进程保存、清理机会;尽量少用 | kill -9 1234 |
| killall 进程名 | 根据进程名批量杀进程 | 不用找 PID,把同名所有进程全部终止 | killall vim |
| pkill | 根据属性杀进程(用户名 / 终端 / 进程名) | 按条件批量匹配进程 | pkill -u hackli |
九、计划任务管理
9.1 at 和 crontab
| 类型 | 命令 | 作用 | 常用操作 |
|---|
| 一次性任务 | at | 指定时间只执行一次 | atq:查看待执行任务atrm 任务号:删除任务输入任务后按Ctrl+D提交 |
| 周期性任务 | crontab | 按周期重复执行(分 时 日 月 周) | crontab -e:编辑定时任务crontab -l:查看任务crontab -r:清空全部任务crontab -u 用户名:root 管理其他用户任务 |
9.2 crontab 时间格式
分(0-59)、时(0-23)、日(1-31)月份(1-12)星期(0-6,0为周日)命令
- * :代表任意时间
- - :连续范围,1-4=1,2,3,4
- , :不连续多值,1,3,5
- / :间隔,*/3每隔3单位
- 50 7 * * * systemctl start sshd.service :每天7点50启动sshd服务
十、crond 服务管理
crond 是底层服务,必须保证 crond 服务开启,定时任务才会生效
- systemctl start crond 启动定时服务
- systemctl status croud 查看运行状态
- systemctl enable crond 设置开机自启
所有评论(0)