🎬进程管理

一、介绍

程序存放代码的文件---->静态

进程程序的运行过程---->动态

同一个程序可能对应多个进程 父进程:程序运行时产生的第一个进程 子进程:由父进程衍生fork()出来的进程

:如果父进程终止,子进程也会随之被终止

[root@localhost yum.repos.d]# yum install nginx -y 
[root@localhost yum.repos.d]# systemctl start nginx [root@localhost yum.repos.d]# ps aux |grep nginx root 27482 0.0 0.1 120896 2096 ? Ss 16:50 0:00 nginx: master process /usr/sbin/nginx nginx 27483 0.0 0.1 123364 3544 ? S 16:50 0:00 nginx: worker process root 27500 0.0 0.0 112724 988 pts/0 S+ 16:50 0:00 grep -- color=auto nginx

进程之进程状态(R、S、D、T、Z、X)

  • 进程概念

1.正在执行的程序

2.正在计算机上执行的程序实例

3.能分配处理并由处理器执行的实体

进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。

这便有了“进程状态”-->进程在内存中因策会忽略调度需求,会处于各种状态

  • linux下的进程状态
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
R-----可执行状态(运行状态)
只有在运行状态的进程才有可能在CPU上运行,注:此为可能!并不意味进程一定在运行中,同一时刻可能有多个进程处在可执行状态,
这些进程的PCB(进程控制块)被放入对应CPU的可执行队伍中,然后进程调度器从各个可执行队列中分别选择一个进程在CPU上运行
如果计算机只有一个处理器,那么一次最多只有一个进程处于这种状态。
 
S-----可中断睡眠状态(sleeping)
处在这个状态意味着进程在等待事件完成。这些进程的PCB(task_struct结构)被放入对应时间的等待队列中。然后等待的事件发生时,对应的进程将被唤醒
 
D-----不可中断睡眠(disk sleep)
在这个状态的进程通常会等待io结束
这个状态与sleeping状态相似,处于睡眠状态,但是此刻进程是不可中断的,意思是不响应异步信号
另外你会发现处在D状态的进程kill -9竟然也杀不死。这就相当于我们怎么也叫不行一个装睡的人。
 
T------暂停状态
给进程发送一个SIGSTOP信号,进程就会响应信号进入T状态,除非该进程正处在D状态
再通过发送STGSTOP信号让进程继续运行
kill -STGSTOP
kill -STGSTNP
 
Z-----僵尸状态
僵尸状态是一个比较特殊的状态,进程在退出的过程中,处于TASK_DEAD状态
在这个退出过程中,进程占有的所有资源将被收回,除了task_struct结构(以及少数资源)以外。于是进程就剩下task_struct这么个空壳,故称为僵尸。
X-----死亡状态或退出状态(dead)
死亡状态是内核运行 kernel/exit.里的do_exit()函数返回的状态。这个状态只是一个返回装态,并不会在任务列表里看到此状态
进程状态切换
 

进程在运行中不断的改变运行状态

就绪态

当前进程已分配到CPU以外对的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态

执行状态

当进程已获得处理机,其程序正在处理机上运行,此时的进程状态就是执行状态

 阻塞态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态,引起进程阻塞的事件有很多。如:等待IO完成、申请缓冲区不能满足、等待信件(信号)等。
 
 就绪态-->执行态
处在就绪态的进程,当调度为其分配好了处理机,就变成了执行态
 
执行态-->就绪态
执行状态的进程在其执行过程中,时间片跑完了不得不让出处理机,于是从执行变成就绪状态
 
执行态-->阻塞态
正在执行的进程等待某种事件而无法继续执行时,便从执行态变成阻塞态
 
阻塞态-->就绪态
处在阻塞状态的进程,如果等待的时间发生,则从阻塞态变成就绪态
 
二、查看进程
ps aux是常用组合,查看进程用户、PID、占用CPU百分比、状态、执行命令等
-a #显示一个终端的所有进程
-u #选择有效的用户的ID或者是用户名
-x #显示没有控制终端的进程,同意显示各个命令的具体路劲

示例

[root@localhost ~]# ps aux |head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128400 7104 ? Ss 8์12 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 8์12 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 8์12 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 8์12 0:01 [kworker/u256:0]

查看结果显示

USER: 运行进程的用户
 
PID: 进程ID
%CPU: CPU占用
 
%MEM: 内存占用率
 
VSZ:占用虚拟内存,单位:kb(killobytes)
              VSZ是指已分配的线性空间的大小,这个大小通常并不等于程序实际用到的大小,产生这个的可能性很多
               比如内存映射。共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小
RSS: 占用实际内存,单位:kb(killobytes)
 RSZ是Resident Set Size,常驻内存大小,即进程实际占用的物理内存大小
 
TTY:进程运行终端
STAT:进程状态  man ps  (/STATE) 
 R 运行
 S 可中断睡眠sleep,即在睡眠的过程中可以接收信号唤醒==>执行io操作可以得到硬件设备的响应
 D 不可中断睡眠,即在睡眠的过程中不可接收信号唤醒==>执行的io操作得不到硬件设备的响应
 T 停止进程
 Z 僵尸进程
 X 死掉的进程(几乎看不见,因为死了就立刻被回收了)
 
 < 标注了<小于号代表优先级较高的进程
 N N代表优先级较低的进程
 
 s 包含子进程
 
 + +表示是前台的进程
 
 l  小写字母l,代表以线程的方式云,即多线程
 | 管道符号代表多线程
 
START: 进程对的启动时间
TIME:进程占用CPU的总时间
COMMAND:进程文件,进程名
           带[]号的代表内核态进程
           不带[]号的代表用户态进程

 linux进程有种睡眠状态

1、interrupt ible sleep(可中断睡眠,在命令中显示"S")

处在这种睡眠状态的进程是可以通过给它发送signal来唤醒的,比如发HUP信号给nginx的master进程

可以让nginx重新加载配置文件,不需要重启nginx进程

2,、UNinterruptible sleep(不可中断睡眠,在ps命令中显示"D")

处在这种状态对的进程不接受外来的任何signal,这也是为什么无法用kill杀掉这些处于D状态的进程,无论是"kill"、"kill -9"、"kill -15"还是被按Ctrl+c、Ctrl+z 都无济于事,因为他们压根儿就不受这些信号的支配
 
解释
进程为什么会被置于D状态?处于UNinterruptible sleep状态的进程通常在等待io,比如磁盘io,网络io,其他外设io,如果进程正在等待的io在较长时间都没有响应,那么就会很不幸地被ps看到了,同时也就意味着很有可能有io出现了问题,可能是外设本身出了故障,也可能是比如NFS挂载的远程文件系统已经不可访问了
 
正是因为得不到io的响应,进程才进入了uninterruptible sleep所以要想使进程从UNinterruptible sleep状态恢复,就得使进程等待的io恢复,比如:如果是因为从远程挂载的NFS卷不可访问导致进程进入UNinterruptible sleep状态的,那么可以通过恢复该NFS卷的链接来使进程的io请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个linux系统了
 
有说法:如果想要杀掉D状态的进程,通常可以去杀掉它的父进程(通常是shell,在shell下直接运行的该进程,之后该进程转入了D状态)但是执行后的状态为:他们的父进程被杀掉了,但是他们的父进程PID都变成了1,也就是init进程,此时这些D进已经影响到其他进程运行,而已经无法访问和恢复NFS卷,所有只好重启了
 
强调
D与z状态的进程都无法用kill -9杀死
 
查看进程树
[root ~]# rpm -qf `which pstree`
psmisc-22.20-16.el7.x86_64
[root ~]# pstree
[root ~]# pstree 104239
bash——bash——bash——bash——pstree

查看ppid

[root ~]# ps -ef | head -10

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 11月01 ? 00:00:07 /usr/lib/systemd/systemd --

system --deserialize 20

root 2 0 0 11月01 ? 00:00:00 [kthreadd]

root 4 2 0 11月01 ? 00:00:00 [kworker/0:0H]

root 6 2 0 11月01 ? 00:00:06 [ksoftirqd/0]

root 7 2 0 11月01 ? 00:00:00 [migration/0]

root 8 2 0 11月01 ? 00:00:00 [rcu_bh]

root 9 2 0 11月01 ? 00:00:03 [rcu_sched]

root 10 2 0 11月01 ? 00:00:00 [lru-add-drain]

root 11 2 0 11月01 ? 00:00:01 [watchdog/0]

动态查看

# 基本用法
[root@localhost ~]# top
[root@localhost ~]# top -d 1 # 1秒刷新一次
[root@localhost ~]# top -d 1 -p 进程pid
[root@localhost ~]# top -d 1 -p `pgrep nginx | head -1`
[root@localhost ~]# top -d 1 -p `pgrep sshd | head -1`,33 # 查看sshdզ݊pid以及pid为33的进程
[root@localhost ~]# top -d 1 -u nginx # 查看指定用户进程
[root@localhost ~]# top -b -n 2 > top.txt # 将2次top信息写入到文件

显示信息解释

第一部分:系统整体统计信息

up左边的代表当前的时间

up右边的代表运行了多长时间

load average: 0.86, 0.56, 0.78         CPU 1分钟 ,5分钟,15分钟平均负载
 
us 用户状态进程占用CPU时间的百分比
sys 内核态进程占用CPU时间的百分比
ni 代表优先级被调度的进程占CPU时间百分比
id CPU空闲的百分比
wa CPU等待io的百分比
hi 硬件中断,处理硬件中断所占用CPU的时间
si 软件中断,处理软件中断所占用CPU的时间
st 被偷走的CPU
 
第二部分:进程信息
top  命令 VSZ,RSS,TTY,STAT,VIRT,RES,DATA的含义
====================================================
VIRT:virtual memory usage 虚拟内存
1.进程"需要的"虚拟内存大小,包括进程使用额库、代码、数据等
2.假如进程申请100m的内存,但实际只用了10m,那么它会增长100m,而不是实际的使用量
 
RES:reisden memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out(当某进程向os请求内存发现不足时,os会把内存中暂时不用的数据交换出去,放在swap分区中,这个过程称为swapu out。当某进程又需要这些数据且os发现还有空闲物理内存时,又会把swap分区中的数据交换回物理内存中,这个过程称为swap IN )
2、 包含其他进程对共享
3、 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、 关于库占用内存的情况,它只统计加载的库文件所占内存大小
 
SHR:resident memory usage 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享的函数,但他包含了整个共享库的大小
3、计算机某个进程所占的物理内存大小公式:RES — SHR
4、swap out后,它将会降下来,因为内存充裕了,没必要挤内存
 
DATA1
1、数据占用的内存。如果top没有显示,按f键、然后用空格选中DATA项目、按q即可显示出来
2、真正的该进程要求的数据空间,是真正在运行中要使用的。
 
top 运行中可以通过top的内部命令对进程的显方式进行控制
命令:
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 对排序进行反转
f 自定义显示字段
l 显示所有CPU的负载
s 改变画面更新频率
 
h | ?帮助
<  向前
>  向后
z  着色,彩色
 
调整进程的优先级
1、r 调整进程的优先级(nice level)
优先级的数值为 -20 ~~19,其中数值越小优先级越高,数值越大优先级越低,最高-20,最低19
注:普通用户只能在0~19之间调整应用程序优先级,超级用户才有权限调整更高优先级
2、k 给进程发送信号1,2,9,15,18,19
 
更多内部命令
l - 关闭或者开启第一部分第一行 top 信息的表示
t - 关闭或者开启第一部分第二行 tasks 和第三行cups信息的表示
m-关闭或者开启第四行 mem 和 第五行 swap 信息的表示
N - 以 PID 的大小的顺序排列表示进程列表
P - 以CPU 占用率的大小顺序来排序
h - 显示帮助
n - 设置在进程列表所显示进程的数量
q - 退出 top
 
 
序号  列名 含义
a PID 进程 id
b PPID 父进程 id
c RUSER Real user name 
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为?
h PR 优先级
i NI nice值。负责表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多个CPU环境下有意义
k %CPU 上次更新到现在的cup时间占用百分比
l TIME 进程使用的CPU 时间总计,单位 秒
m TIME+ 进程使用的CPU时间总计,单位秒1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
p SAWP 进程使用的虚拟内存中被换出的大小,单位kb 
q RES 进程使用的、未被换出的物理内存大小,单位kbRES=CODE+DATA
r CODE  可执行代码占用的物理内存大小
s DATA  可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR  共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数
w S  进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,z=僵尸进程)
x COMMAND  命令名/命令行
y WCHAN  若该进程在睡眠,则显示睡眠中的系统函数名
z Flags  任意标志,参考 sched.h
 
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
可用以下快捷键更改显示内容
通过 f 键可以选择显示内容。按 f 键之后会显示列的列表,按a-z即可显示或隐藏对应的列,最后回车键确定
按o键可以改变列的显示顺序。按a-z可以将相应的列向右移动,而A-Z可以将相应的列向左移动。最后回车键确定
按 F 或 O 键,然后再按a-z可以将进程按照相应的列表进行排序。而R键可以将当前的排序倒转
三、shell管理进程
 1、优先级设置
可以在启动进程时用nice命令设置优先级
命令
nice [-n  <优先级数值>]  [--help] [--version] [执行指令]
选项
若nice命令未指定优先级的调整值,则以缺省值10来调整程序运行优先级,即在当前程序运行优先级基础之上增加10
    -n  <优先级>    指定优先级
  --help                 帮助信息
  --version            版本信息
执行范例:让命令以新的优先级执行:[root@localhost ~]# nice -n 5 ls # nice -n -20 命令
 ps -l 命令
重要信息:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID : 代表这个进程是由哪个进程发展衍生而来的,即父进程的代号
PRI : 代表这个进程可被执行的优先级,其越小越早被执行
NI : 代表这个进程对的nice值
 
对正在运行的进程设置新的优先级:[root@localhost ~]# renice -20  命令
2.给进程发信号  
[root@localhost ~]# kill -l    列出所有支持的信号
===================解释======================
HUP :1、挂起信号  2、可以让进程重新加载配置
此信号在用户终端连接(正常或非正常)结束时发出,通常是在终端对的控制进程结束时,通知session内的各个作业,这时他们与控制终端不再关联。
登录linux时,系统会分配给登录用户一个终端(session )。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都会属于这个session。当用户退出linux登录时,前台进程组和后台有对终端输出的进程就会终止。不过,可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略,这样就算退出了
Linux登录,wget也能继续下载
此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新加载
# INT(2): 中断,通常因为按下Ctrl+c而产生的信号,用于通知前台进程组终止
# QUIT(3): 退出,和SIGINT类似,但由QUIT字符(通常是Ctrl-)来控制,进程在因收到SIQUIT退出时会产生core文件,在这个意义上类似于一个进程错误信号。
# TSTP(20) :停止进行运行,通常因为按下Ctrl+z
# KILL (9)  :用来立即结束程序的运行,本信号不能被阻塞、处理和忽略,强制杀死。 
# TERM(15) :正常终止
# CONT(18) :被暂停的进程继续恢复运行
# SIGSTOP(19) :暂停进程
# SIGCHLD :子进程结束时,父进程会收到这个信号
 
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程,这种情况应该避免父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管
 
kill -l 重新加载配置文件
#1、启动vsftpd服务
[root ~]# systemctl start vsftpd # 默认匿名用户共享根目录为/var/ftp
[root ~]# ls /var/ftp/
centos7 pub

# 2、打开浏览器,输入ftp://192.168.12.42/,  看到的是/var/ftp下的内容
# 3、修改vsftp的配置文件,默认匿名用户根目录/test
[root ~]# sed -i '$a anon_root=/test' /etc/vsftpd/vsftpd.conf 
# 4、在不启动服务vsftp的情况下让其加载配置文件
[root ~]# ps aux |grep [v]sftpd
root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[root ~]# kill -1 50695 # 这期间vsftpd的pid是始终不变的,因为从未关闭过进程
[root ~]# ps aux |grep [v]sftpd
root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
#5、打开浏览器,重新输入ftp://192.168.12.42/看到的是/test下对的内容

kill 杀死进程

# kill -15 不加-15,默认就是-15对的信号
[root ~]# ps aux |grep [v]sftpd
root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[root ~]# kill 50695
[root ~]# ps aux |grep [v]sftpd
# kill -9强制杀死
[root@localhost ~]# ps aux |grep nginx
root 29978 0.0 0.1 120896 2096 ? Ss 17:28 0:00 nginx:
master process /usr/sbin/nginx
nginx 29979 0.0 0.1 123364 3544 ? S 17:28 0:00 nginx:
worker process
root 29984 0.0 0.0 112724 988 pts/0 S+ 17:28 0:00 grep --
color=auto nginx
[root@localhost ~]# kill -9 29978

暂停kill-19与恢复进程kill -18

[root ~]# ps aux |grep [v]sftpd
root 106530 0.1 0.0 53288 572 ? Ss 21:17 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[root ~]# kill -stop 106530
[root ~]# ps aux |grep [v]sftpd
root 106530 0.0 0.0 53288 572 ? Ts 21:17 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[root ~]# kill -cont 106530
[root ~]# ps aux |grep [v]sftpd
root 106530 0.0 0.0 53288 572 ? Ss 21:17 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

[root ~]# # 也可以用数字
[root ~]# kill -19 106530
[root ~]# ps aux |grep [v]sftpd
root 106530 0.0 0.0 53288 572 ? Ts 21:17 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[root ~]# kill -18 106530
[root ~]# ps aux |grep [v]sftpd
root 106530 0.0 0.0 53288 572 ? Ss 21:17 0:00
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

杀死所有:根据进程名称杀死所有

[root ~]# vim a.txt &
[root ~]# vim b.txt &
[root ~]# vim c.txt &
                  、、、、、、、、、、、、、
[root ~]# killall -9 vim
[root ~]# pkill -9 vim

查看某个用户开启的进程

[root ~]# pgrep -l -u 用户
 
 
原文地址:https://www.cnblogs.com/ChuangShi-HolySpirit/p/13921699.html