进程
定义:进程故名思义,正在运行的程序的载体,描述的是程序正在运行的状态。
百度百科:进程(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 | 顶级进程 |
进程优先级
- 优先级的范围
-20~19 (越负值表示优先级越高) - 优先级如何查看
ps ax -o stat,pid,comm
- 指定进程优先级
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的优先级。
环境中进程前后台调用
- jobs 查看被打入后台的进程
(+表示正在接受服务,-表示次优先,没有符号的在-后等待)
当我们在终端打开一个进程时,会占用我们的终端。
- ctrl+z 把占用终端的进程打入后台
- comm & 命令后加&,让命令直接在后台运行
- fg jobsnum 将后台进程调回前台(fontground)
- bg jobsnum 将后台暂停的程序调回前台运行(background)
- 南桥——低频设备:键盘,硬盘等
- 北桥——高频设备: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 | 调整刷新频率 |
c | cpu负载排序 |
m | 内存用量排序 |
h | 查看帮助 |
u | 查看制定用户进程 |
k | 对制定进程发起信号 |
q | 退出 |
z | 显示颜色 |
控制服务
- 什么是服务?
定义:系统中运行的对于系统本身没有意义但是对客户主机有重大意义的程序叫做服务性软件简称服务。
c/s模型 client / server - 如何控制服务?
系统初始化进程可以对服务进行相应的控制。 - 当前系统的初始化进程
前面我们查看过:使用pstree
发现是系统初始化进程是systemd pid为1
- 进程控制命令
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 | 解锁服务 |