进程基本概述
什么是进程
当我们运行一个,,那么我们将运行的程序叫进程
当我们运行一个程序,那么我们将运行的程序叫进程
PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限
PS2:在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息
2.程序和进程的区别
程序是数据和指令的集合,是一个静态的概念,比如/bin/ls /bin/cp 等二进制文件,同时程序可以长期存在系统中
进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中
3.程序的生命周期
一个对象从无到有、从有到无过程称为生命周期(就绪态 执行态 僵死态 停止态 睡眠态)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSqqwxRE-1616648156721)(en-resource://database/556:1)]
当父进程接收到任务调度时,会通过fock派生子进程来处理,子进程会继承父进程衣钵(相当于完全复制了一份父进程的信息)
子进程在处理任务代码时,父进程会进入等待状态中
子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源
如果子进程在处理任务过程中,父进程退出,子进程没有退出,子进程没有被父进程管理,则变为僵尸进程
每个进程都有自己的PID号,子进程称为PPID
监控进程状态
程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为:静态和动态两种方式
1.使用ps命令查看当前的进程状态(静态)
ps的使用
ps –auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等
参数 | 解释 |
---|---|
-a | 显示所有终端机下执行的进程,除了阶段作业领导者之外 |
-u | 以用户为主的格式来显示进程状况 |
-x | 显示所有进程,不以终端机来区分 |
-f | 用ASCII字符显示树状结构,表达进程间的相互关系 |
[root@heng ~]# ps -auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 16:36 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 16:36 0:00 \_ [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 16:36 0:00 \_ [kworker/u256:0]
root 6 0.0 0.0 0 0 ? S 16:36 0:00 \_ [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 16:36 0:00 \_ [migration/0]
root 8 0.0 0.0 0 0 ? S 16:36 0:00 \_ [rcu_bh]
root 9 0.0 0.0 0 0 ? R 16:36 0:01 \_ [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 16:36 0:00 \_ [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 16:36 0:00 \_ [watchdog/0]
root 13 0.0 0.0 0 0 ? S 16:36 0:00 \_ [kdevtmpfs]
标志 | 意义 |
---|---|
USER | 该process属于哪个使用者账号的 |
PID | 该process的号码 |
%CPU | 该process 使用掉的CPU资源百分比 |
%MEM | 该process所占用的物理内存百分比 |
VSZ | 该process使用掉的虚拟内存量(Kbytes) |
RSS | 该process占用的固定的内存量(Kbytes) |
TTY | 该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序 |
STAT | 该程序目前的状态 |
START | 该process 被触发启动的时间 |
TIME | 该process实际使用CPU运作的时间 |
COMMAND | 该程序的实际指令有[ ]: 内核态进程 无[ ]:用户进程 |
STAT基本状态 | 描述 | STAT状态符号 | 描述 |
---|---|---|---|
R | 进程运行 | s | 进程是控制进程,Ss进程的领导者,父进程 |
S | 可中断睡眠 | < | 进程运行在高优先级上,S<优先级较低的进程 |
T | 进程被暂停 | N | 进程运行在低优先级上,SN优先级较低的进程 |
D | 不可中断进程 | + | 当前进程运行在前台,R+该表示进程在前台运行 |
Z | 僵尸进程 | l | 进程是多线程的,Sl表示进程是以线程方式进行 |
案例1
1)在终端1上运行vim
[root@lzy ~]# vim test
2)在终端2上运行ps命令查看状态
[root@lzy ~]# ps axu|grep test #S表示睡眠模式 +表示前台运行
root 14240 0.1 0.5 151868 5676 pts/1 S+ 10:48 0:00 vim test
root 14271 0.0 0.0 112660 968 pts/2 R+ 10:48 0:00 grep --color=auto test
3)在终端1上挂起vim命令按下: ctrl+z
4) 回到终端2再次运行ps命令查看状态
root@lzy ~]# ps axu|grep test # T表示停止状态
root 14240 0.0 0.5 151868 5676 pts/1 T 10:48 0:00 vim test
root 14279 0.0 0.0 112660 964 pts/2 R+ 10:51 0:00 grep --color=auto test
案例2
PS命令查看不可中断状态进程
使用tar打包文件时,可以通过中断不断查看状态,由S+,R+变为D+
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.6 0.1 124268 1888 pts/2 S+ 10:56 0:01 tar zcf etc.tar.gz
/etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.7 0.2 124380 2240 pts/2 R+ 10:56 0:01 tar zcf etc.tar.gz
/etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.9 0.2 124916 2724 pts/2 D+ 10:56 0:01 tar zcf etc.tar.gz
/etc/ /usr/ /var
- 使用top命令查看当前的进程状态 动态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoZu2Hig-1616648156724)(en-resource://database/557:1)]
任务 | 含义 |
---|---|
Tasks:73 total | 当前进程的总数 |
2 running | 正在运行的进程数 |
71 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
%Cpu(s):49.2 us | 系统用户进程使用CPU百分比 |
5.7 sy | 内核进程占用CPU百分比,内核是于硬件进行交互 |
ni | 优先调度进程占用CPU 的时间 |
45.2 id | 空闲CPU的百分比 |
0.0 wa | CPU等待IO完成的时间 |
0.0 hi | 硬中断,占的CPU百分比 |
0.0 si | 软中断,占的cpu百分比 |
0.0 st | 比如虚拟机占用物理CPU的时间 |
什么是中断
中断就是终止当前在做的事情 去执行另一段程序
会保留现场,执行的那段程序做完之后会在回来执行刚来尚未完成的部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VylTYLj-1616648156726)(en-resource://database/555:1)]
top的使用
命令:top参数 | 含义 |
---|---|
h | 查看帮助 |
1 | 数字1,显示所欲偶CPU核心的负载 |
z | 以高亮显示数据 |
b | 高亮显示处于R状态的进程 |
M | 按内存使用百分比排序输出 |
p | 按照CPU使用百分比排序输出 |
q | 退出top |
管理进程状态
当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们可以使用linux的kill命令对进程发送关闭新号,当然除了kill 还有killall pkill killall安装yum install psmisc
kill 的使用
1.使用kill -l 列出当前系统所支持的信号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAaOOiKE-1616648156730)(en-resource://database/554:1)]
虽然Linux信号很多,但是我们仅仅使用最常用的3个信号
1、SIGHUP重新加载配置文件 -1
2、SIGKILL强制杀死进程 -9
3、SIGTERM终止进程 ,默认kill使用该信号 -15
[root@lzy ~]# ps axu|grep nginx
root 15688 0.0 0.1 87384 1132 ? Ss 12:19 0:00 nginx: master process /usr/sbin/nginx
nginx 15689 0.0 0.3 89096 3176 ? S 12:19 0:00 nginx: worker process
root 15691 0.0 0.0 112660 968 pts/3 R+ 12:19 0:00 grep --color=auto nginx # 发送重新加载信号 nginx配置文件发生改变,可用此重新加载
[root@lzy ~]# kill -1 15688
[root@lzy ~]# ps axu|grep nginx
nginx 15692 0.0 0.3 89376 3648 ? S 12:19 0:00 nginx: worker process
root 15722 0.0 0.0 112660 968 pts/3 R+ 12:20 0:00 grep --color=auto nginx
发送停止信号 kill pid
[root@lzy ~]# kill 15692
强制终止服务
kill -9 15692
2.Linux系统中killall,pkill命令用于杀死指定名字的进程,我们可以使用kill命令杀死指定进程的PID的进程,killall和pkill直接杀进程而不需要查pid
[root@lzy ~]# killall nginx
[root@lzy ~]# pkill nginx
使用pkill踢出从远程登录到本机的用户,终止pts1上所有进程,用户强制退出
发现不认识的远程连接
[root@lzy ~]# pkill -9 -t pts/1
管理后台进程
1) 什么是后台进程
他你刚才进程读会在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
2) 如何把程序放在后台
# 把进程放入后台运行 使用 &
[root@lzy ~]# sleep 3000 &
[1] 15909
# 把进程挂起放在后台
[root@lzy ~]# sleep 4000
^Z
[3]+ Stopped sleep 4000 [root@lzy ~]#
# jobs 显示在后台运行的程序
[root@lzy ~]# jobs
[1]- Running sleep 3000 &
[2]+ Running sleep 4000 &
# 让作业2在后台运行
[root@lzy ~]# bg %2
[2]+ sleep 4000 &
[root@lzy ~]# jobs
[1]- Running sleep 3000 &
[2]+ Running sleep 4000 &
#将作业1掉回到前台运行
[root@lzy ~]# fg %1
sleep 3000
# 终止后台PID为2的进程
[root@lzy ~]# kill %2
[root@lzy ~]# jobs
[1]+ Stopped sleep 3000
[2]- Terminated sleep 4000
# & 后台运行
for i in {1..10};do echo $i;done & # 内容还是输出到屏幕
for i in {1..10};do echo $i;done &>/dev/null & # 内容定向到空
screen的使用 常用
1) 安装
yum –y install screen
2) 使用方法
#screen 指定一个任务名称后进入到一个新bash中
screen -S wget_jenkins
#在新bash中执行一条下载命令
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm
#平滑退出screen 不会终止任务,如果使用exit则退出
ctrl+a+d # 平滑退出screen任务
#查看正在运行的screen有哪些任务
[root@lzy ~]# screen -list
There is a screen on:
43698.wget_jenkins (Detached)
1 Socket in /var/run/screen/S-root.
#进入正在执行的screen任务中 或者使用PID即可进入
[root@lzy ~]# screen -r wget_jenkins
## nohup的使用 常用经常用
nohup sh 1.sh & #不挂断地运行命令
使用nohup来运行程序 默认会在当前运行的路径生成一个nohup.out 输出文件
*/5 * * * * > /data/scripts/nohup.out
进程的优先级
1) 在启动进程时,为不同的进程使用不同的调度策略
nice 值越高 表示优先级越低,例如+19 该进程容易将CPU使用量让给其他进程
nice值越低 表示优先级越高,例如-20, 改进程更不倾向于让出CPU
使用top或ps命令查看进程的优先级
####使用top可以查看nice优先级 NI:实际nice级别,默认是0 动态修正CPU调度。范围(-20~19)。越大,cpu调度越一般,越小,cpu调度越偏向它。一般用于后台进程,调整也是往大了调,用来给前台进程让出CPU资源
PR: 优先级 显示nice值,PR默认是20,越小,优先级越高。修改nice可以同时修改PR -20映射到0, +19映射到39
使用ps查看进程优先级
2)nice指定程序的优先级,语法格式nice -n 优先级数字 进程名称
#####开启vim并指定程序优先级为-5 并查看进程优先级
#####renice命令修改一个正在运行的进程优先级,语法格式 renice –n 优先级数字 进程 pid
1)查看sshd进程当前的优先级状态
[root@lzy ~]# ps axo pid,command,nice|grep sshd
1114 /usr/sbin/sshd -D 0
30865 sshd: root@pts/0 0
2) 调整sshd主进程的优先级
[root@lzy ~]# renice -n -20 1114
1114 (process ID) old priority 0, new priority -20
exit 退出当前bash
登陆查看调整或的优先级 再次登陆后会由主进程fork子进程 子进程会继承主进程的优先级
[root@lzy ~]# ps axo pid,command,nice|grep sshd
1114 /usr/sbin/sshd -D -20
43747 sshd: root@pts/0 -20
43770 grep --color=auto sshd -20
测试环境可修改ssh的优先级为-20 等级高
当某个进程持续占用cpu 导致负载过高 从而导致ssh无法连接
线上环境---->给用户提供服务
nginx----> 占用cpu