大家好,又见面了,我是你们的朋友全栈君。
目录
一、进程概念
1.进程组成部分:
2.僵尸进程:
3.线程:
4.上下文切换:
5.中断处理:
6.进程的属性
二、ps查看进程工具
1.-aux弹出消息及详解
2、linux进程有5种基本状态
三、free 查看内存使用情况
1.弹出消息及详解:
三、uptime 查看系统负载
1.弹出消息含意如下:
四、top 命令 动态性能分析工具
1.每行信息
2.top 快捷键:
五、lsof 命令 用于查看你进程调用、打开的文件
六、kill 关闭进程
1)kill信号
2.killall 命令 (关闭一类进程)
3.pkill 命令 (关闭一类进程)
七、前后台进程切换
1.前台进程:
2.后台进程:
3.跟系统任务相关的几个命令:
1.进程的优先级管理
1)nice(调整优先级)
2)renice(改变运行中程序的优先级)
2.screen 终端复用工具
附:常用 screen 参数
一、进程概念
1.进程组成部分:
• 已分配内存的地址空间;以页为单位
• 进程 ID;
• 程序的代码;
• 进程状态;
单个cpu情况下多个进程要到cpu上运行。进程在cpu上运行的时间叫做时间片
进程管理包括进程调度、中断处理、信号、进程优先级、进程切换、进程状态、进程内存等等。
下图所示的是进程的生命周期:
描述如下:
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。
每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。
PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程。
所有进程都是第一个系统进程的后代。
centos5 或 6PID 为 1 的进程是:init
centos7 PID 为 1 的进程是:systemd
2.僵尸进程:
不执行代码,占用内存地址空间
当一个进程接收到终止信号时,它结束之前需要一段时间来结束所有任务。
在进程执行所有代码之后,它将相关终止报告发给父进程。
父进程正常情冴下会移除所有子进程的数据结构。
如果父进程没能接收子进程退出信号,那么子进程变为僵尸进程。
所以通常在很短的某个时刻内它是一个僵尸进程。
使用 kill 命令是不能杀死僵尸进程的,因为它已经被认定为死亡了。
可以尝试杀死僵尸进程的父进程,僵尸进程会随之消失。
如果一个进程为僵尸状态,父进程是 init 或 systemd 那么需要重启系统来解决问题。
3.线程:
线程是进程中产生的一个执行单元,在同一个进程中不其他线程并行运行。
线程之间可以共享资源,比如内存、地址空间、打开文件等。
4.上下文切换:
在处理器执行期间,运行进程的信息被存储在处理器的寄存器和高速缓存中。
执行的进程被加载到寄存器的数据被称为上下文。
在实际处理器运行过程中,先存储运行进程的上下文。
然后将下一个要运行的进程的上下文恢复到寄存器,这个过程称之为上下文切换。
一般不能有太多上下文切换。
因为处理器每次要刷新寄存器和高速缓存,以便释放空间给新进程,可能导致性能下降。
5.中断处理:
中断是优先级最高的任务之一。
通常由 I/O 产生,比如网络接口、键盘、磁盘控制器等。
当一个中断信号到达内核的时候,内核必须从当前执行的进程切换到一个新的进程,以便处理这个中断。
这意味着中断会导致上下文切换。也就是说大量中断会导致性能下降。
注意:在 Linux 当中有两种类型的中断。硬中断和软中断。
硬中断是由硬件产生的,需要快速响应(比如:磁盘 IO 中断、键盘中断、鼠标中断等)
软中断被用来处理可以推迟的任务(TCP/IP、SCSI 协议操作等)。
6.进程的属性
进程 ID(PID):是唯一的数值
父进程的 ID(PPID)
启动进程的用户 ID(UID)和所弻属的组(GID)
进程状态:状态分为运行 R、休眠 S、僵尸 Z
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU 占用量)
二、ps查看进程工具
ps 查看进程工具
常用的参数:
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示
x: 显示所有进程,不以终端机来区分
常用的选项组合是 ps -aux
1.-aux弹出消息及详解
【】# ps -axu | more
注: 最后一列[xxxx] 使用方括号括起来的进程是内核态的进程,没有括起来的是用户态进程。
上面的参数输出每列含意:
USER: 启动这些进程的用户
PID: 进程的 ID
%CPU 进程占用的 CPU 百分比;
%MEM 占用内存的百分比;
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
STAT:该程序目前的状态,
2、linux进程有5种基本状态
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
D 不可中断状态,通常存在于 I/O 情冴下。
5 个基本状态后,还可以加一些字母,比如:Ss、R ,如下图:
它们含意如下::
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
: 表示当前进程运行在前台
START:该进程被触发启动的时间;
TIME :该进程实际使用 CPU 运作的时间。
COMMAND:该程序的实际指令
例 1: 查看进程状态
【】# vim a.txt
在另一个终端执行:
【】# ps -aux | grep a.txt #查看状态 S 表示睡眠状态, 表示前台
root 4435 0.0 0.2 151752 5292 pts/1 S 20:52 0:00 vim a.txt
root 4661 0.0 0.0 112676 996 pts/0 S 21:05 0:00 grep –color=auto a.txt
在 vim a.txt 这个终端上 按下: ctrl z
[1] 已停止 vim a.txt
在另一个终端执行:
【】# ps -aux | grep a.txt #查看状态 T 表示停止状态
root 4435 0.0 0.2 151752 5292 pts/1 T 20:52 0:00 vim a.txt
root 4675 0.0 0.0 112676 996 pts/0 S 21:05 0:00 grep –color=auto a.txt
注:
ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销
例 2: D 不可中断状态
【】# tar -zcvf usr-tar.gz /usr/
#然后在另一个终端不断查看状态,由 S ,R 变为 D
ps 常用的参数: ps -ef
-e 显示所有进程
-f 显示完整格式输出
2.-ef弹出消息及详解
包含的信息如下:
UID: 启动这些进程的用户
PID: 进程的 ID
PPID: 父进程的进程号
C: 进程生命周期中的 CPU 利用率
STIME: 进程启动时的系统时间
TTY: 表明进程在哪个终端设备上运行。如果显示 ?表示不终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME: 运行进程一共累计占用的 CPU 时间
CMD: 启动的程序名称
例 1:测试 CPU 使用时间。
dd if=/dev/zero of=/a.txt count=10 bs=100M
[root@localhost ~]# ps -axu | grep dd
三、free 查看内存使用情况
[root@localhost ~]# free -m
1.弹出消息及详解:
total used free shared buff/cache available
Mem: 972 603 69 24 299 123
Swap: 2047 69 1978
其中:
第一行:total 是总内存量,used 是已经使用的内存量,free 是空闲的内存,shared 是多个进程共享的内存总数,buffers 是缓冲内存数,cached 是缓存内存数。默认单位是 KB。
第二行开始:
total 系统中有 972MB 的物理内存,
used 是已经使用的内存数量。
free 是空闲的内存数量。shared 是多个进程共享的内存数量。
buff/cache 用来作为缓冲和缓存的空间,内核会在内存将要耗尽时释放这部分内存给其他进程使用。
availble:可使用空间,评估有多少内存可用于启动新应用程序。
available 字段考虑了页缓存,而不是所有可回收的内存。
正因为这个原因所以通常 free buff/cache 的数值要比 available 的数值大。
第三行为 swap 虚拟内存。
在上面信息中我们可以看到,其实系统上并没有运行什么服务。但是有 299 的 cache,这是因为在实验过程中进行过多次读写执行等操作。这些文件会被系统暂时缓存下来,以便下次运行的时候能够快速的读取。这种使用都是正常的情冴,说明物理内存正在被合理的使用。但是如果我们发现 swap 区域一直被大量使用,这就说明物理内存不足。可能需要考虑系统上 swap 使用比例或者添加物理内存。
三、uptime 查看系统负载
uptime 查看 CPU 负载工具
【】# uptime
13:22:30 up 20days, 2 users, load average: 0.06, 0.60, 0.48
1.弹出消息含意如下:
任务队列的平均长度是什么?
大厅排除买票:
这时队列是 4:
cpu 队列数为 3 时,如图:
例 1:找出前当系统中,CPU 负载过高的服务器?
服务器 1: load average: 0.15, 0.08, 0.01 1 核
服务器 2: load average: 4.15, 6.08, 6.01 1 核
服务器 3: load average: 10.15, 10.08, 10.01 4 核
如果服务器的 CPU 为 1 核心,则 load average 中的数字 >=3 负载过高,如果服务器的 CPU 为 4 核心, 则 load average 中的数字 >=12 负载过高。
经验:单核心,1 分钟的系统平均负载不要超过 3,就可以,这是个经验值。
如下图: 1 人只能买 1 张票,排第四的人可能会急。 所以我们认为超过 3 就升级 CPU
四、top 命令 动态性能分析工具
[root@localhost ~]# top #top 弹出的每行信息含意如下:
1.每行信息
第一行内容和 uptime 弹出的信息一样进程和 CPU 的信息( 第二、三行)
当有多个 CPU 时,这些内容可能会超过两行。内容如下:
Tasks: 481 total | 进程总数 |
---|---|
1 running | 正在运行的进程数 |
480 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
Cpu(s): 0.0% us | 系统用户进程使用 CPU 百分比。 |
0.0% sy | 内核中的进程占用 CPU 百分比 |
0.0% ni | 用户进程空间内改变过优先级的进程占用 CPU 百分比 |
98.7% id | 空闲 CPU 百分比 |
0.0% wa | cpu 等待 I/0 完成的时间总量。 测试: 终端 1:执行:top 终端 2:dd if=/dev/zero of=/a.txt count=10 bs=100M 终端 3:dd if=/dev/zero of=/a.txt count=10 bs=100M 如下: |
0.0% hi 硬中断消耗时间 | 硬中断,占的 CPU 百分比。1. 硬中断是由硬件产生的,比如,像磁盘, 网卡,键盘,时钟等。 |
0.0% si 软中断消耗时间 | 软中断,占的 CPU 百分比。硬中断是由硬件设备产生,需要快速响应。 软中断被用来处理可以推迟的任务(如 TCP/IP 操作,SCSI 协议)。 |
0.0 st (steal 偷) | st:虚拟机偷取物理的时间。比如:物理机已经运行了 KVM,XEN 虚 拟机。KVM 虚拟机占用物理机的 cpu 时间 |
内存信息(第四五行)
内容如下:
Mem: 2033552k total | 使用的物理内存总量 |
---|---|
1376636k free | 空闲内存总量 |
316524k buff/cache | 用作内核缓存的内存量。 和 free -k 一个意思 |
Swap: 2017948k total | 交换区总量 |
0k used | 使用的交换区总量 |
192772k free | 空闲交换区总量 |
注:如果 swap 分区,被使用,那么你的内存不够用了。
第 7 行进程信息
列名 | 含义 |
---|---|
PID | 进程id |
USER | 进程所有者的用户名。 |
PR | 优先级(由内核动态调整),用户不能修改。 |
NI | 进程优先级。 nice 值。负值表示高优先级,正值表示低优先级,用户可以 自己调整。 |
VIRT(virtual memory usage) | 虚拟内存,是进程正在使用的所有内存(ps 中标为 VSZ) VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请 100m 的内存,但实际只使用了 10m,那么它会增长 100m,而不是实际的使用量 |
RES(resident memory usage) | 是进程所使用的物理内存。实际实用内存(ps 中标为 RSS) RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括 swap out 2、包含其他进程的共享 3、如果申请 100m 的内存,实际使用 10m,只增长 10m,不 VIRT 相反 4、关于库占用内存的情冴,它只统计加载的库文件所占内存大小 |
SHR | 共享内存大小,单位 kb SHR:shared memory 共享内存 1、除 M 了自身进程的共享内存,也包括其他进程的共享内存 2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小 3、计算某个进程所占的物理内存大小公式:RES – SHR 4、swap out 后,它将会降下来 |
S | 进程状态。 D=不可中断的睡眠状态 R=运行中或可运行 S=睡眠中 T=已停止 Z=僵停 |
%CPU | 上次更新到现在的 CPU 时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME | 进程使用的 CPU 时间总计,单位 1/100 秒 |
COMMAND | 命令名/命令行 |
2.top 快捷键:
默认 3s 刷新一次,按 s 修改刷新时间
按空格 :立即刷新。
q 退出
P:按 CPU 排序
M:按内存排序
T 按时间排序
p: 进程 IP,查看某个进程状态
数字键 1:显示每个内核的 CPU 使用率
u/U:挃定显示的用户
h:帮助
例 1:使用 TOP 动态只查看某个或某些进程的信息
找到进程 ID
[root@localhost ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.8/FAQ
root 9667 0.0 0.2 143620 3344 pts/1 S< 19:15 0:00 vim a.txt
[root@localhost ~]# top -p 9667
10.2.3 实戓 1:找出系统中使用 CPU 最多的进程
运行 top , 找出使用 CPU 最多的进程 ,按大写的 P,可以按 CPU 使用率来排序显示
在 linux 系统中一个进程,最多可以使用 100%cpu 对吗? 不对,因为多个cpu,有几个就是百分之几百
如下图,可以看到 dirtycow(脏牛漏洞,用于提权) 进程使用 196.8%
五、lsof 命令 用于查看你进程调用、打开的文件
lsof 命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)
-i<条件>:列出符合条件的进程,ipv4 或 ipv6。(4、6、协议、:端口、 @ip )
-p<进程号>:列出挃定进程号所打开的文件;
例:
[root@localhost ~]# vim a.txt
[root@localhost ~]# ps -axu | grep a.txt
root 43641 0.8 0.2 151744 5280 pts/3 S 18:19 0:00 vim a.txt
root 43652 0.0 0.0 112676 996 pts/1 S 18:19 0:00 grep –color=auto a.txt
[root@localhost ~]# lsof -p 43641 #一般用于查看进程,在读哪些文件
[root@localhost ~]# lsof -i :22 #用于查看端口,或查看开启端口是哪个进程在使用
六、kill 关闭进程
关闭进程 3 个命令:kill killall pkill
kill 关闭进程:kill 进程号 关闭单个进程
killall 和 pkill 命令用于杀死指定名字的进程
通过信号的方式来控制进程的
kill -l =====> 列出所有支持的信号
1)kill信号
信号编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断 crtl c
3) SIGQUIT 退出
9) SIGKILL 强制终止
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止
20) SIGTSTP 暂停 crtl z
1.kill 命令 (关闭单个进程)
root@localhost ~]# ps aux | grep sshd
[root@localhost ~]# kill -1 3017
[root@localhost ~]# vim test.sh
[root@localhost ~]# ps aux | grep “vim” | grep -v “grep”
root 3037 0.0 0.3 143968 3608 pts/1 S 03:25 0:00 vim test.sh
[root@localhost ~]# kill -19 3037
[root@localhost ~]# ps aux | grep “vim” | grep -v “grep”
root 3037 0.0 0.3 143968 3608 pts/1 T 03:25 0:00 vim test.sh
2.killall 命令 (关闭一类进程)
kill [子选项][信号] 进程名
选项:-i:交互式,询问是否要杀死某个进程。
交互式杀死 sshd 进程:
[root@localhost ~]# killall -i sshd #交互式杀死 sshd 进程。
3.pkill 命令 (关闭一类进程)
pkill 命令和 killall 命令非常相似,也是按照进程名来杀死进程。
pkill [选项][信号] 进程名
选项:
-t 终端号:按照终端号踢出用户。
七、前后台进程切换
– nice 进程优先级-实战 screen 后台执行命令
Linux 后台进程不前台进程的区别
1.前台进程:
是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这这个进程也随着消失
2.后台进程:
其中有一类后台进程也叫守护进程(Daemon)。
是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互。
Linux 的大多数服务器就是用守护进程实现的。比如,Web 服务器 httpd 等。
进程的前台与后台运行
3.跟系统任务相关的几个命令:
ctrl z
&
jobs
fg
bg
命令 | 功能 |
---|---|
& | 用在一个命令的最后,可以把这个命令放到后台执行. |
ctrl z | 将一个正在前台执行的命令放到后台,并且暂停. |
jobs | 查看当前有多少在后台运行的进程.它是一个作业控制命令 |
fg (foreground process) | 将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以 用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后 台正在执行的命令的序号(从是 pid) |
bg(backgrou nd process) | 将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用 bg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台 正在执行的命令的序号(不是 pid) |
nohup:放到后台不依赖终端
用法【】bohup [命令] &
恢复被挂起的进程
例: vim a.txt 按下: ctrl z
【】# vim a.txt #打开后,然后执行 ctrl z
1] 已停止 vim a.txt
【】# ps -axu | grep vim
root 43710 0.8 0.2 151744 5304 pts/3 T 18:26 0:00 vim a.txt
root 43720 0.0 0.0 112676 984 pts/3 S 18:26 0:00 grep –color=auto vim
【】# jobs #查看当前有多少在后台运行的进程
[1] 已停止 vim a.txt
【】# fg 1 #将后台挂起的进程恢复到前台运行
1.进程的优先级管理
优先级取值范围为(-20,19),越小优先级越高, 默认优先级是 0
1)nice(调整优先级)
命令 1:nice -n 挃定程序的运行优先级
格式:nice n command
2)renice(改变运行中程序的优先级)
命令 2:renice 改变程序的运行优先级
格式:renice -n pid
2.screen 终端复用工具
使用 screen 后台实时执行命令备份命令
实战场景:公司晚上需要备份大量数据,我在 xshell 上直接执行备份脚本可以吗?
或直接运行脚本 & 放到后台运行可以吗?
当关了 xshell 后,back.sh & 还在后台执行吗?
3.6 screen 概述和安装
Screen 中有会话的概念,,用户可以在一个 screen 会话中创建多个 screen 窗口,在每一个 screen 窗口中就像操作一个真实的 telnet/SSH 连接窗口那样。
安装 screen 软件包
# rpm -ivh /mnt/Packages/screen-4.1.0-0.23.20120314git3c2946.el7_2.x86_64.rpm
或者
【】# yum -y install screen
screen 使用方法
直接在命令行键入 screen 命令回车,如下图
【】# screen
Screen 将创建一个执行 shell 的全屏窗口。你可以执行任意 shell 程序,就像在 ssh 窗口中那样
例如,我们在做某个大型的操作但是突然之间断开:
实战:使用 screen 后台实时执行命令备份命令
【】# screen #进入
【】# vim a.txt #执行命令, 或执行你自己需要运行的备份命令
此时想离开一段时间,但还想让这个命令继续运行
【】# #在 screen 当前窗口键入快捷键 Ctrl a d
[detached from 44074.pts-3.localhost] #分离出来独立的一个会话
半个小时之后回来了,找到该 screen 会话:
【】# screen -ls #查看已经建立的会话 ID
There is a screen on:
44074.pts-1.tivf06 (Detached)
1 Socket in /tmp/screens/S-root.重新连接会话:
【】# screen -r 44074
【】# exit #不想使用 screen 会话了,执行:exit 退出。
注意:exit退出后是彻底关闭会话,再进入无会话,需要重新再次建立
附:常用 screen 参数
screen -S test -> 新建一个叫 test 的会话
screen -ls -> 列出当前所有的会话
screen -r test -> 回到 test 会话
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197354.html原文链接:https://javaforall.cn