Linux玩转进程管理

进程

定义:进程故名思义,正在运行的程序的载体,描述的是程序正在运行的状态。

百度百科:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

进程的状态

在我们之前学的操作系统中,进程有三种状态:

1)就绪状态(Ready):
进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
2)运行状态(Running):
进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
3)阻塞状态(Blocked):
由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。

也有更详细的五种状态:
在这里插入图片描述

创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行
执行状态:进程处于就绪状态被调度后,进程进入执行状态
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

但是,在我们linux当中,我们通过查看进程的状态,发现一般是以下几种:

进程状态含义
R(Running)程序正在运行中
S(Sleep)程序正在休眠状态(idle),但可以被唤醒(signal)
D不可被唤醒的睡眠状态,可能在等待I/O
T(Stop)工作控制或除错状态(traced)
Z(Zombie)程序已经终止但无法被移除内存

相关命令及参数

ps 进可以查看系统的相关进程
在这里插入图片描述
相关参数列表:

参数含义
-A系统所有进程,包含运行环境
-e作用同-A
e显示进程的详细信息,系统资的调用等
-a在shell当中运行的进程环境信息,不包括环境信息
a在shell当中运行的进程环境信息,包括环境信息
-d系统开启的进程信息,不包含shell
x显示所有运行包含tty输出设备的终端
f显示进程的父子关系,按树状
-o查看进程指定属性信息

注意: 当父进程强行结束了,孤儿进程产生,交给系统初始化进程管理,可能导致程序出现问题,所以,一般应该先结束子进程,再结束父进程。

实验小示例:

[root@client /]# ps -A
  PID TTY          TIME CMD
    1 ?        00:00:04 systemd
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 ksoftirqd/0
    5 ?        00:00:00 kworker/0:0H
    7 ?        00:00:00 migration/0
    8 ?        00:00:00 rcu_bh
    9 ?        00:00:00 rcuob/0
   10 ?        00:00:01 rcu_sched
   11 ?        00:00:02 rcuos/0
   12 ?        00:00:00 watchdog/0
   13 ?        00:00:00 khelper
   14 ?        00:00:00 kdevtmpfs
   15 ?        00:00:00 netns
   16 ?        00:00:00 writeback
   17 ?        00:00:00 kintegrityd
   18 ?        00:00:00 bioset
   19 ?        00:00:00 kblockd
   20 ?        00:00:00 khubd
   21 ?        00:00:00 md
   2880 pts/0    00:00:00 bash
   3075 ?        00:00:00 sshd
   3080 pts/1    00:00:00 bash
   3112 pts/1    00:00:00 dbus-launch
   3113 ?        00:00:00 dbus-daemon
   3117 ?        00:00:00 dconf-service
   15064 ?        00:00:00 pickup
   16222 ?        00:00:00 kworker/0:0
   16449 ?        00:00:00 kworker/0:2
   16575 ?        00:00:00 kworker/0:1
   16706 ?        00:00:00 sleep
   16720 pts/1    00:00:00 ps

因为系统中所有的进程太多,所以我这里只展示了开头和结尾~

注意看ps -a和ps a 的区别,-a只显示目前在shell中的进程,a除此之外,显示了shell的进程以及开启shell的依赖环境。

[root@client /]# ps -a 
  PID TTY          TIME CMD
 3112 pts/1    00:00:00 dbus-launch
16801 pts/1    00:00:00 ps
[root@client /]# ps a
  PID TTY      STAT   TIME COMMAND
  585 tty1     Ss+    0:11 /usr/bin/Xorg :0 -background none -verbose -auth /run
 2880 pts/0    Ss+    0:00 /bin/bash
 3080 pts/1    Ss     0:00 -bash
 3112 pts/1    S      0:00 dbus-launch --autolaunch=946cb0e817ea4adb916183df8c4f
16803 pts/1    R+     0:00 ps a

ps -f显示了进程之间的父子关系:
在这里插入图片描述ps常用的一些组合:

命令含义
ps aux显示系统中所有进程并显示用户信息
ps ef显示进程详细信息并显示父子进程关系
ps ax显示系统中所有进程
pstree显示当前系统进程树

示例:

[root@client /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  52328  6600 ?        Ss   4月06   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    4月06   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    4月06   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   4月06   0:00 [kworker/0:0H]
只显示一部分,全部进程信息太多了

通过pstree发现,系统开启的第一个进程是systemd,他的pid为1。
在这里插入图片描述通过管道符查看却是如此:

[root@client /]# ps aux | grep 1
root         1  0.0  0.3  52328  6600 ?        Ss   4月06   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root        10  0.0  0.0      0     0 ?        R    4月06   0:01 [rcu_sched]
root        11  0.0  0.0      0     0 ?        S    4月06   0:02 [rcuos/0]
root        12  0.0  0.0      0     0 ?        S    4月06   0:00 [watchdog/0]
root        13  0.0  0.0      0     0 ?        S<   4月06   0:00 [khelper]

注意

kill -9 1结束不掉这个进程,因为系统依赖于systemd,只认poweroff这样的指令

ps -o pid,comm,%mem,%cpu,stat(状态),user,nice(优先级),tty(终端设备)

进程按属性排序

在这里插入图片描述
示例:

以CPU使用率正序显示所有进程,显示信息以-o后的pid,comm等信息顺序显示:
[root@client /]# ps -A --sort=%cpu -o pid,comm,%cpu,nice,%mem,user
  PID COMMAND         %CPU  NI %MEM USER
    1 systemd          0.0   0  0.3 root
    2 kthreadd         0.0   0  0.0 root
    3 ksoftirqd/0      0.0   0  0.0 root
    5 kworker/0:0H     0.0 -20  0.0 root
    7 migration/0      0.0   -  0.0 root
    8 rcu_bh           0.0   0  0.0 root
    9 rcuob/0          0.0   0  0.0 root
以Mem内存使用率逆序显示相关信息:
[root@client /]# ps -A --sort=-%mem -o  pid,user,comm,%cpu,%mem,nice,stat
  PID USER     COMMAND         %CPU %MEM  NI STAT
 2035 root     gnome-shell      0.0  9.6   0 Sl
  585 root     Xorg             0.0  1.7   0 Ss+
 1970 root     gnome-settings-  0.0  1.2   0 Sl
 2087 root     nautilus         0.0  1.1   0 Sl
  470 root     firewalld        0.0  1.1   0 Ssl
 2876 root     gnome-terminal-  0.0  0.9   0 Sl
  474 root     tuned            0.0  0.9   0 Ssl
 2030 root     goa-daemon       0.0  0.8   0 Sl
 1776 root     gnome-session    0.0  0.7   0 Ssl
 1144 root     libvirtd         0.0  0.7   0 Ssl
 2238 root     abrt-applet      0.0  0.7   0 Sl
 2125 root     evolution-addre  0.0  0.7   0 Sl
  579 polkitd  polkitd          0.0  0.7   0 Ssl
 2131 root     evolution-calen  0.0  0.7   0 Sl
 2141 root     tracker-store    0.0  0.6   0 Sl
 2222 root     tracker-miner-f  0.0  0.6  19 SNl

测试:如何将系统中内存使用率前五的进程pid显示在终端:

使用刚刚学的进程属性排序,然后将输出通过管道符取前6位,然后再通过管道剔除属性名:
[root@client /]# ps -A --sort=-%mem -o pid | head -n 6 | tail -n 5
 2035
  585
 1970
 2087
  470
——————————————————————————————————
  验证一下
——————————————————————————————————
[root@client /]# ps -A --sort=-%mem -o pid,%mem
  PID %MEM
 2035  9.6
  585  1.7
 1970  1.2
 2087  1.1
  470  1.1

stat中显示的信息

我们上面做排序实验时,输出进程属性的时候,会发现stat状态信息,对应的我们解释一下:

S进程状态
l内存中有锁定空间
N优先级低
<优先级高
+前台运行
s顶级进程

在这里插入图片描述

进程优先级

  1. 优先级的范围
    -20~19 (越负值表示优先级越高)
  2. 优先级如何查看

ps ax -o stat,pid,comm

  1. 指定进程优先级

nice -n 优先级范围内的数字 进程名
这里是开启时进程的优先级,重启进程后恢复正常。

实验:
先用watch进行监控,看变化:
在这里插入图片描述
这里可以看到每个进程的初始优先级,我们可以通过图形界面进行修改,当然,作为一名程序员,当然是要用指令修改了~

[root@client /]# nice -n 10 vim

发现监控这边有变化:
在这里插入图片描述
设定进程的优先级:

renice -n 优先级范围内的数字 pid
这里是设定进程的优先级。

在这里插入图片描述

[root@client /]# renice -n 10 21877
21877 (process ID) old priority 0, new priority 10

在这里插入图片描述
发现我们修改成功firefox的优先级。

环境中进程前后台调用

  1. jobs 查看被打入后台的进程
    (+表示正在接受服务,-表示次优先,没有符号的在-后等待)
    在这里插入图片描述
    当我们在终端打开一个进程时,会占用我们的终端。
    在这里插入图片描述
  2. ctrl+z 把占用终端的进程打入后台
  3. comm & 命令后加&,让命令直接在后台运行
    在这里插入图片描述
  4. fg jobsnum 将后台进程调回前台(fontground)
    在这里插入图片描述
    在这里插入图片描述
  5. bg jobsnum 将后台暂停的程序调回前台运行(background)
    在这里插入图片描述在这里插入图片描述
  6. 南桥——低频设备:键盘,硬盘等
  7. 北桥——高频设备:cpu,内存等

进程信号

信号等级含义
1不停机加载配置(进程不关闭情况下重载配置),意义重大!
2删除进程在内存中的数据(不能位锁定内存,如果锁定内存,进程也会被关闭)相当于Ctrl+c
3删除鼠标在内存中数据(光标消失)
9强行结束单个进程(不会阻塞)
15正常关闭进程(可能被阻塞)
18运行暂停的进程
19暂停某个进程(不能被阻塞)
20把进程打入后台(可以被阻塞)
man 7 signal查看信号详细信息
kill		-信号		进程pid
	##杀掉单个进程,请用kill来杀掉
killall		-信号		进程名
	##杀死一类同名进程
pkill		-u	username	-信号		
	##是ps命令和kill命令的结合,按照进程名来杀死指定进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序

示例:
删除进程在内存中的数据:kill -2 pid
在这里插入图片描述通过kill -15 pid 正常关闭gedit
在这里插入图片描述

killall	-19	进程名 		##暂停进程,点击firefox无反应
killall	-18	进程名 		##恢复暂停的进程,点击firefox有反应

在这里插入图片描述

pskill 	-u 	username 	-信号
##将所属某一类用户的进程关闭
man pkill 		 ##里面有pgrep pkill的参数

可以通过 grep 过滤器 筛选相关用户进程

在这里插入图片描述

进程动态监控top

进入进程后的操作含义
1显示每个CPU负载
s调整刷新频率
ccpu负载排序
m内存用量排序
h查看帮助
u查看制定用户进程
k对制定进程发起信号
q退出
z显示颜色

控制服务

  1. 什么是服务?
    定义:系统中运行的对于系统本身没有意义但是对客户主机有重大意义的程序叫做服务性软件简称服务。
    c/s模型 client / server
  2. 如何控制服务?
    系统初始化进程可以对服务进行相应的控制。
  3. 当前系统的初始化进程
    前面我们查看过:使用pstree
    发现是系统初始化进程是systemd pid为1
    在这里插入图片描述
  4. 进程控制命令
ssh---------------->sshd
客户端				服务器
systemctl  参数     服务名称 		##服务控制命令

以sshd服务为例:

systemctl status sshd查看sshd服务的状态,inactive不可用,active可用
systemctl start sshd开启sshd服务
systemctl stop sshd关闭sshd服务
systemctl restart sshd重启服务
systemctl reload sshd重载服务
systemctl enable sshd开机启动
systemctl disable sshd开机不启动
systemctl list-units列出已经开启服务当前状态
systemctl list-units-files列出所有服务的开机启动状态
systemctl list-dependencies列出服务依赖
systemctl set-default multi-user.target设定系统启动级别为:多用户(无图形)
systemctl set-default graphical.target图形模式
systemctl mask sshd冻结服务
systemctl umask sshd解锁服务
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值