目录
Linux之进程
进程简介
定义
进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位
组成部分
- 已分配内存的地址空间
- 安全属性,包含所有全凭根和特权
- 程序代码的一个或多个执行线程
- 进程状态
程序与进程的区别
进程 --- 是程序运行的过程,动态,有生命周期及运行状态
- 程序是静态的,它只是一组指令的集合,不具有任何的运行意义,而进程是程序运行的动态过程
- 进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程
- 进程还具有并发性和交往性,而程序却是封闭的
进程与线程的区别
线程 --- 进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行
- 一个进程可以拥有多个线程,而一个线程只能被一个进程所拥有
- 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及序列出口,它必须组成进程才能被执行
父子进程
子进程 --- 由一个进程所产生的进程,产生这个子进程的进程称为父进程
在Linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境
父进程终止子进程自然终止
堆栈段(stacksegment) --- 指采用堆栈方式工作的一段内存区域。当程序被执行时,程序可能会将其执行的状态加入栈的顶部;当程序结束时,它必须把栈顶的状态数据弹出(pop)
子进程工作过程:
子进程 继承 父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec 自己的程序代码。通常, 父进程 在子 进程运行期间 处于 睡眠(sleeping)状态 。当 子进程完成 时 发出(exit)信号请求 ,在退出时,子进程已经 关闭 或 丢弃 了 其资源环境 ,剩余的部分称之为 僵停 (僵尸Zombie )。 父进程 在子进程退出时收到信号而 被唤醒 , 清理剩余的结构 ,然后 继续执行 其 自己的程序代码
前台进程和后台进程
前台进程 --- 在 shell 提示处理打入命令后,创建一个子进程,运行命令, Shell 等待命令退出,然后返回到对用户给出提示符。这条命令与 Shell 异步运行,即在前台运行,用户在它完成之前不能执行别一个命令
后台进程 --- 在 Shell 提示处理打入命令,若后随一个 &, Shell 创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与 Shell 同步运行,即在后台运行。“后台进程必须是非交互式的
进程分类
进程的状态
查看进程
查看当前系统信息 --- ww
[root@joker ~]# w
解读信息的含义:
JCPU --- 以终端代号来区分,该终端所有相关的进程的进程执行时,所消耗的CPU时间会显示在这里
PCPU --- cpu 执行程序消耗的时间
WHAT --- 用户下在执行的操作
load average --- 分别显示系统在1、5、15分钟内的平均负载程度
FROM --- 显示用户从何处登陆系统
IDLE --- 用户闲置时间,这是一个计时器,一旦用户执行任何操作,该计时器便会被重置
查看个别用户信息 --- w [用户名]
[root@joker ~]# w root
静态查看进程 --- ps
参数及作用
参数 | 作用 |
-a | 显示所有用户的进程 |
-u | 显示用户名和启动时间 |
-x | 显示没用控制终端的进程 |
-e | 显示所有进程,包括没有控制终端的进程 |
-l | 长格式显示 |
-w | 宽行显示,可以使用多个w进行加宽显示 |
查看隶属自己的进程
- ps -u or-l 查看隶属于自己进程的详细信息
- ps -le or-aux 查看所有用户执行的进程的详细信息
- ps -aux -sort pid 可按进程执行的时间、PID、UID等对进程进行排序
信息含义解析
USER --- 运行进程的用户
PID --- 进程ID
%CPU --- CPU占用率
%MEM --- 内存占用率
VSZ --- 占用虚拟内存
RSS --- 占用实际内存 驻留内存
TTY --- 进程运行的终端
STAT --- 进程状态 man ps (/STATE)
R --- 运行S --- 可中断睡眠 SleepD --- 不可中断睡眠T --- 停止的进程Z --- 僵尸进程X --- 死掉的进程Ss --- s进程的领导者,父进程S< --- <优先级较高的进程SN --- N优先级较低的进程R + --- + 表示是前台的进程组Sl --- 以线程的方式运行START --- 进程的启动时间TIME --- 进程占用CPU的总时间COMMAND --- 进程文件,进程名
案例
通过内存升序排序,并分页查看
[root@joker ~]# ps aux --sort rss |less
通过内存降序排序,并分页查看
[root@joker ~]# ps aux --sort -rss |less
通过CPU升序排序,并分页查看
[root@joker ~]# ps aux --sort %cpu |less
通过CPU降序排序,并分页查看
[root@joker ~]# ps aux --sort -%cpu |less
常用操作
自定义查看显示字段
[root@joker ~]# ps axo user,pid,ppid,%mem,command |less
查看进程树
[root@joker ~]# pstree
查看指定进程的PID
[root@joker ~]# cat /run/sshd.pid
查看服务进程号
pgrep [ 服务名称 ]
[root@joker ~]# pgrep -l sshd
[root@joker ~]# pgrep sshd
pidof [ 服务名称 ]
[root@joker ~]# pidof sshd
动态查看进程 --- top
[root@joker ~]# top
第一部分解析
主要是系统整体信息统计
top --- 当前时间
up --- 机器运行多长时间
users --- 当前登陆用户数
load average --- 系统负载,即任务队列的平均长度,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值
Tasks --- 当前有多少进程
runnin --- 正在运行的进程数
sleeping --- 正在休眠的进程数
stopped --- 停止的进程数
zombie --- 僵尸进程数
us --- 用户空间占CPU的百分比
sy --- 内核空间占CPU的百分比
ni --- 用户进程空间改变过优先级
id --- 空闲CPU占用率
wa --- 等待输入输出的CPU时间百分比
hi --- 硬中断占用百分比(硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理(消耗CPU时间)
si --- 软中断占用百分比(软中断是由程序发出的中断,最终也会执行相应的处理程序,消耗CPU时间)
st --- steal time
total --- 物理内存总量
free --- 空闲内存总量
used --- 使用的内存总量
buffer/cache --- 用作内核缓存的内存
total --- 交换区内存总量
free --- 空闲交换区总量
used --- 使用的交换区总量
buffer/cache --- 缓冲的交换区总量
第二部分详解
PID --- 进程id
USER --- 进程所有者的用户名
PR --- 优先级
NI --- nice值,负值表示高优先级,正值表示低优先级
VIRT --- 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES --- 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR --- 共享内存大小,单位kb
S --- 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU --- 上次更新到现在的CPU时间占用百分比
%MEM --- 进程使用的物理内存百分比
TIME+ --- 进程使用的CPU时间总计,单位1/100秒
COMMAND --- 命令名/命令行
命令及作用
命令 | 作用 |
h|?
| 帮助 |
M
|
按
内存的使用
排序
|
P
|
按
CPU使用
排序
|
N
| 以PID的大小排序 |
R
| 对排序进行反转 |
f
| 自定义显示字段 |
1
| 显示所有CPU的负载 |
<
|
向前
|
>
| 向后 |
z
| 色彩 |
W
| 保存top环境设置 |
nohup命令
可以在用户退出时继续执行某一进程
语法格式
nohup program &
信号控制将进程
列出所有支持的信号
[root@joker ~]# kill -l
常用信号:编号 信号名1 ) SIGHUP 重新加载配置2 ) SIGINT 键盘中断 ^C3 ) SIGQUIT 键盘退出9 ) SIGKILL 强制终止15 ) SIGTERM 终止(正常结束),缺省信号18 ) SIGCONT 继续19 ) SIGSTOP 停止20 ) SIGTSTP 暂停 ^Z
进程相关命令及其功能
作业控制
定义
命令及作用
命令 | 作用 |
cmd& | 该命令在后台运行 |
Ctrl+d | 终止一个正在前台运行的进程(含有正常含义) |
Ctrl+c | 终止一个正在前台运行的进程(含有强行含义) |
Ctrl+z | 挂起一个正在前台运行的进程 |
jobs | 显示后台作业和被挂起的进程 |
bg | 重新启动一个挂起的作业,并在后台运行 |
fg | 把一个在后台运行的作业放到前台运行 |
作业标识符及作用
标识符 | 作用 |
%N | 第N号作业 |
%S | 以字符串S开头的被命令行调用的作业 |
%?S | 包含字符串S的被命令行调用的作业 |
%+ | 默认作业(前台最后结束的作业,或后台最后启动的作业,等同于%%) |
%- | 第二默认作业 |
案例
示例1 --- 运行程序(时),让其在后台
[root@joker ~]# sleep 3000 &
示例2 --- 查看后台挂起
[root@joker ~]# ps aux |grep sleep
示例3 --- 查看后台作业
[root@joker ~]# jobs
示例4 --- 将作业1调回到前台
[root@joker ~]# fg %1
示例5 --- 终止PID为1的进程
[root@joker ~]# kill %1