【linux】05_进程管理

1.什么是进程

如何产生进程?“执行一个程序或命令”就可以触发一个事件而取得一个PID。由于系统只认识二进制文件,所以当我们要让系统工作的时候,就需要启动一个二进制文件,这个二进制文件就是程序。程序一般放在磁盘中,然后通过用户的执行而触发。触发后会加载到内存中称为一个个体,那就是进程。为了使操作系统可以管理这个进程,因此进程有给予执行者的权限/属性更参数,并包括进程所需要的脚本与数据或文件数据等,最后再给一个PID。
1.程序与进程
程序:通常是二进制程序,防止在存储媒介中(如硬盘等),以物理文件的形式存在。
进程:程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加再到内存中,操作系统也会给这个内存中的的单元一个标识符PID,进程就是一个正在运行的程序。
2.子进程与父进程
进程彼此之间时有相关性的,被父进程触发的进程就是子进程,子进程可以取得父进程的环境变量。如何看进程的父进程?通过Parent PID(PPID)来判断即可。
在这里插入图片描述
在目前的bash环境下,又再一次出发了bash,可以看到第一个bash的PID与第二个bash的PPID都是2138,这是因为第二个bash是来自于第一个所产生的。
3.进程的状态
R(Running):正在运行中的进程,其中包括了等待CPU时间片的进程。
S(Sleep):正在睡眠状态的进程。通常情况下,系统的大部分进程都是这个状态。(可以被唤醒,是系统正在运行的状态)
D:该进程是不可被唤醒的睡眠状态,通常可能是在等待I/O读写。
T:停滞状态,不表示结束stoped,可能是在工作控制(被暂停)或出错(可以强制唤醒 fg)
Z:僵尸状态,进程结束的时候,依然占用系统资源,却不为系统服务
4.孤儿进程
父进程被强行关闭,就会产生孤儿进程,孤儿进程受系统初始化进程的管控。systemd(PID 为1)系统初始化进程,是系统开启的第一个进程。systemd这个进程不可能被关掉,只有poweroff时才会结束掉。
例如:apache的httpd服务关掉(kill -9 PID),子进程仍然存在,存在的进程就属于孤儿进程。
5.僵尸进程
通常,造成僵尸进程的原因是因为该进程应该已经执行完毕,或者是因故要终止了,但是该进程的父进程却无法完整将该进程结束掉,而造成哪个进程一直存在内存当中。如果看到某个进程COMMAND后面还跟又,就代表该进程是僵尸进程。

2.查看进程

1.图形方式查看
gnome-system-monitor
在这里插入图片描述
2.进程静态查看命令ps
在这里插入图片描述
查看进程的命令是ps,如果不确定可以用whatis查看。参数的调用可以使用1)ps --help查看2)man ps
在这里插入图片描述
ps命令 参数整理


ps	-A	##所有进程(可以看到firefox,不仅是shell的进程),与-e相同
	-a	##当前环境中运行的进程(不包含环境本身的信息,以外所有)
	-u	##显示进程用户信息
	 a	##在当前环境中运行的进程(包含环境本身的信息)
	 x	##列出系统中所有运行包含tty输出设备,通常与a参数一起使用,可列出较完整信息
     f	##显示进程的父子关系
     e	##显示进程的详细信息(系统的资源调用)

ps命令 常用组合整理

ps -l       ##仅列出与自己操作环境(bash)有关的进程,即最上层的父进程是自己的bash
ps aux      ##查看系统的所有进程并显示进程用户
ps ef		##显示进程详细信息并显示进程父子关系
ps ax		##显示当前系统中的所有进程

在这里插入图片描述
上面的命令只是将目前属于自己这次登陆的PID与相关信息列出来了(只与自己的bash有关)
在这里插入图片描述
上图列出了目前所有的正在内存当中的进程。一般来说ps aux会按照PID的顺序来排序显示。
ps命令 显示进程指定信息

ps -o 	xxx	    ##显示进程的指定信息
		comm	##进程名称
		user	##进程所有人
		group	##进程所有组
		%cpu	##进程cpu使用率
		%mem	##进程内存使用率
		pid	    ##进程id
		nice	##进程优先级

3.动态查看进程命令top
top命令用于动态监控进程所占的系统资源,每隔3s更新一次。它的特点是把占用系统资源(CPU、内存、磁盘I/O)最高的进程放在最前面。
在这里插入图片描述
top主要分为两个界面,上面的界面为整个系统的资源使用状态,基本上总共有六行。显示的内容依次是:
第一行:目前的时间、开机到目前经历的时间、已经登陆系统的用户人数、系统在1、5、15min的平均工作负载(系统平均要负责运行几个进程的意思)。越小代表系统越闲置。
第二行:目前进程的总量以及各个进程都在什么状态。
第三行:CPU的整体负载
第四行:目前的物理内存使用情况
第五行:目前的虚拟内存使用情况(swap的使用量要尽量少!如果swap被大量使用,表示系统的物理内存实在不足!)
第六行:在top进程中输入命令时显示状态的地方。
下面的界面为每个进程使用的资源情况。
PR(Priority):进程的优先执行顺序,越小越早被执行。
NI(Nice):与PR有关,也是越小越早被执行。
TIME+:CPU使用时间的累加
在这里插入图片描述
在第6行可以输入:

    1	##显示cpu每个核的负载
	s	##调整刷新频率
	c	##cpu负载排序
	m	##内存使用量排序
	h	##查看帮助
	u	##查看指定用户进程
	k	##对指定进程发起信号
	q	##退出

在这里插入图片描述
还有一个命令top -bn1,表示非动态打印系统资源的使用情况,可以用在shell脚本中。
在这里插入图片描述
可以将某个时段top的信息存到文件中。
4.进程排序

ps -A --sort=%mem|%cpu -o %mem|%cpu(按内存/cpu使用量正序排序 并显示出内存/cpu使用情况)
ps -A --sort=-%mem|%cpu -o %mem|%cpu(倒序)

【Q】打印出系统内存使用情况前五的进程pid
在这里插入图片描述
上图我多打印了内存使用情况,也可以不显示
在这里插入图片描述

3.进程的优先级

S	##进程状态
L	##内存中有锁定空间(被锁了内存分页)
l   ##多线程进程
N	##优先级低
<	##优先级高
+	##前台运行(比如终端执行ps aux就是前台进程)
s	##顶级进程(主进程)

1.优先级范围
-20~19(默认都是0)
2.优先级查看
ps ax -o pid,nice,comm
在这里插入图片描述
3.PRI与NI
PRI是由内核动态调整的,用户无法直接调整PRI的值。所以如果我们想要调整进程的优先执行顺序,只能通过Nice值。一般而言,PRI(new)=PRI(old)+nice。但需要注意的是,如果原本PRI是50,并不是我们把nice值设置为5,就会使PRI变成55。因为PRI是系统动态决定的,虽然nice值会影响PRI,但是最终的PRI仍要经过系统分析后才会决定。当nice值为负值时,PRI值会被降低,即会变得较优先。
root可以随意调整自己或他人进程的nice值,范围为-20~19 。
一般用户仅可调整自己进程的nice值,且范围仅为0~19(避免一般用户抢占系统资源)
一般用户仅可将nice值越调越高

4.一开始执行程序就立即给予一个特定的nice值
nice -n 优先级数字 进程名称(nice 后面是进程名)
在这里插入图片描述
上图意思是在后台打开一个gedit程序,并将它的优先级NI值设置为-5 。查看之后,用fg将这个程序调到前台运行,再关闭。
在这里插入图片描述

5.调整某个已经存在的PID的nice值
renice -n 优先级数字 pid(renice后面是进程号)
在这里插入图片描述
上图意思为找到自己bash的pid,并将bash的优先级调整为10

4.环境中进程的前后台调用

comm &			##让命令直接在后台运行
jobs			##查看被打入环境后台的进程

在这里插入图片描述
用&在后台运行程序gedit,再用jobs查看打入后台的进程。
在这里插入图片描述
可以看到在后台执行gedit程序,Sl表示该程序的内存有锁定空间,gedit在后台仍能运行。
在这里插入图片描述
但是vim是的状态是T(停滞状态),vim不能在后台运行,可以将它调回前台。

fg jobsnum		##把后台进程调回前台
fg默认调用+(在前台运行,不是正在运行),调回前台后,-变+

在这里插入图片描述
在后台运行的程序有两个gedit和vim。但是fg,调回前台的是前面带有+的vim,gedit的-变成了+。

ctrl+z			##把占用终端的进程打入后台并暂停
bg jobsnum		##让后台暂停的进程运行

在这里插入图片描述
用ctrl+z把gedit和firefox两个程序打入后台,bg让这两个程序在后台运行。

5.进程信号

进程之间是可以互相控制的,程序之间的相互管理其实就是通过给予该进程一个信号。一共有多少个信号呢?可以使用kill -l或man 7 signal查询到。
在这里插入图片描述

1) SIGHUP 
本信号在用户终端连接(正常或非正常)结束时发出
通常是在终端的控制进程结束时
通知同一session内的各个作业
这时它们与控制终端不再关联. 
2) SIGINT 
程序终止(interrupt)信号
在用户键入INTR字符(通常是Ctrl-C)时发出 
3) 
SIGQUIT 和SIGINT类似
但由QUIT字符(通常是Ctrl-)来控制
进程在因收到SIGQUIT退出时会产生core文件
在这个意义上类似于一个程序错误信号. 
4) 
SIGILL 执行了非法指令
通常是因为可执行文件本身出现错误或者试图执行数据段
堆栈溢出时也有可能产生这个信号. 
5) 
SIGTRAP 由断点指令或其它trap指令产生
由debugger使用. 
6) 
SIGABRT 程序自己发现错误并调用abort时产生. 
6) 
SIGIOT 在PDP-11上由iot指令产生在其它机器上和SIGABRT一样. 
7) 
SIGBUS 非法地址
包括内存地址对齐(alignment)出错. 
eg: 访问一个四个字长的整数但其地址不是4的倍数. 
8) 
SIGFPE 在发生致命的算术运算错误时发出. 
不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误
9) 
SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略. 
10) 
SIGUSR1 留给用户使用 
11) 
SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据. 
12) 
SIGUSR2 留给用户使用 
13)
SIGPIPE Broken pipe 
14) 
SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间
alarm函数使用该信号. 
15) 
SIGTERM 程序结束(terminate)信号
与SIGKILL不同的是该信号可以被阻塞和处理
通常用来要求程序自己正常退出
shell命令kill缺省产生这个信号. 
17) 
SIGCHLD 子进程结束时, 父进程会收到这个信号. 
18) 
SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 
可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作
例如, 重新显示提示符 
19) 
SIGSTOP 停止(stopped)进程的执行
注意它和terminate以及interrupt的区别: 
该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略. 
20) 
SIGTSTP 停止进程的运行
但该信号可以被处理和忽略
用户键入SUSP字符时 
(通常是Ctrl-Z)发出这个信号 
21) 
SIGTTIN 当后台作业要从用户终端读数据时, 
该作业中的所有进程会收到SIGTTIN信号
缺省时这些进程会停止执行. 
22) 
SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到. 
23) 
SIGURG 有"紧急"数据或out-of-band数据到达socket时产生. 
24) 
SIGXCPU 超过CPU时间资源限制
这个限制可以由getrlimit/setrlimit来读取/改变 
25) 
SIGXFSZ 超过文件大小资源限制. 
26) 
SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间. 
27) 
SIGPROF 类似于SIGALRM/SIGVTALRM
但包括该进程用的CPU时间以及系统调用的时间. 
28) 
SIGWINCH 窗口大小改变时发出. 
29) 
SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作. 
30) 
SIGPWR Power failure 

有两个信号可以停止进程:SIGTERM和SIGKILL。 
SIGTERM比较友好,进程能捕捉这个信号
根据您的需要来关闭程序。
在关闭程序之前您可以结束打开的记录文件和完成正在做的任务
在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

对于SIGKILL信号,进程是不能忽略的。
这是一个 “我不管您在做什么,立刻停止”的信号
假如您发送SIGKILL信号给进程,Linux就将进程停止在那里

1.常用进程信号等级
主要的信号代号与名称对应如下:

1		SIGHUP   ##进程重新加载配置,即启动被终止的进程,可以让该PID重新读取自己的配置文件
2		SIGINT   ##删除进程在内存中的数据,相当于用键盘输入ctrl+c来中断一个进程的进行
3		SIGQUIT  ##删除鼠标在内存中的数据
9		SIGKILL  ##强行结束单个进程(不可被阻塞)
                   如果该进程进行到一半,那么尚未完成的部分可能有“半成品”产生,类似vim会有.swap
15		SIGTERM  ##正常关闭进程(可能会被阻塞)
18		SIGCONT  ##运行暂停的进程
19		SIGSTOP  ##暂停某个进程(不能被阻塞)
20		SIGTSTP  ##把进程打入后台(可以被阻塞)

如何传送一个信号给某个进程呢?就要用到接下来的命令。
2.kill命令

kill	-信号	进程id

kill可以将signal传送给某个工作(%jobnumber)或者是某个PID。这两种情况是不一样的!因为工作控制中有1号工作,但是PID 1则是专指“init”进程,二者不一样。
在这里插入图片描述
上面的操作是 首先找到syslog进程的PID,然后使用kill传送信号1,使syslog重新读取配置文件。要确认有没有重启syslog,查看日志文件的内容即可。
3.killall命令
由于kill后面必须要加上PID (或者job number),所以通常kill都会配合ps、pstree等命令,因为必须要找到相对应的进程PID。这样很麻烦,可以使用killall加进程名称。

killall -信号	进程名字

总之,要删除某个进程,可以使用这两种命令,kill+PID或killall+进程名。如果要删除某个服务,建议使用killall,因为它可以将系统当中所有以某个命令名称启动的进程全部删除。

6.控制服务

1.什么是服务
服务的开启对服务端没有意义,对客户端有意义。

2.用什么控制服务
系统初始化进程systemd可以对服务进行相应的控制,systemd支持多个服务并发启动,这种方式启动非常快。

3.当前系统初始化进程是什么
systemd ##系统初始化进程(所有进程的父进程)
pstree ##显示系统中的进程树
在这里插入图片描述

4.进程控制命令
服务: ssh ------> sshd
对应:client------>server

systemctl			##服务控制命令
systemctl	status	sshd	##查看服务状态,inactive(不可用),active(可用)
systemctl	start	sshd	##开启服务
systemctl	stop	sshd	##关闭服务
systemctl	restart sshd	##重启服务

在这里插入图片描述
查看防火墙服务的状态为active,关闭服务,再次查看为inactive。

systemctl	reload	sshd	##重新加载服务配置
systemctl	enable	sshd	##设定服务开机启动
systemctl	disable	sshd	##设定服务开机不启动
systemctl	list-units	    ##列出已经开启服务的当前状态(只有正在运行的)

在这里插入图片描述

和unit相关的命令:
systemctl	list-units	--all                     ##列出所有的unit(包括inactive)
systemctl	list-units	--all  --state=inactive   ##列出所有inactive的unit
systemctl	list-units	--all  --type=service     ##列出所有状态的service
systemctl	list-units	--type=service            ##列出状态为active的service
systemctl	is-active crond.service               ##查看某个unit是否active

在这里插入图片描述

systemctl	list-unit-files	                ##列出所有服务开机启动状态
systemctl	list-dependencies	            ##列出服务依赖
systemctl	set-default multi-user.target	##设定系统启动级别为多用户模式(无图形)
systemctl	set-default graphical.target	##设定系统启动级别为图形模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值