系统进程知多少

一:进程的概念

在自身的虚拟地址空间中运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以成为一个进程。进程虽然是由程序产生,但是它并不是程序。程序是一个关于进程指令的集合,它可以启用一个或多个进程。同时程序只占用磁盘空间,而不占用系统运行资源,而进程仅仅占用系统内存空间,是动态的、可变的、关闭进程,占用的内存资源随之释放。

 

二:进程的分类

按进程的功能和运行的程序分类,进程可以划分为两大类:

(1)系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。

(2)用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。

针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。

(1)交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行与前台,也可以运行在后台。

(2)批处理进程:该进程是一个进程集合,负责按顺序启动其它的进程。

(3)守护进程:一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性地执行某种任务或者处理某些发生的事件。

 

三:进程的属性

(1)进程的几种状态:进程在启动后,不一定马上开始运行,因而进程存在在以下多种状态。

a:可运行状态:处于该状态的进程,要么正在运行,要么正准备运行

b:可中断的等待状态:该类进程处于阻塞状态,一旦达到某种条件,就会变为运行状态;同时该状态的进程也会由于接受到信号而被提前唤醒进入到运行状态。

c:不中断的等待状态:处于这个状态的进程对信号不做响应。

d:僵死状态:每个进程在结束后都会处于僵死状态,等待父进程调用而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。

e:暂停状态:表示此时的进程暂停执行,来接受某种特殊处理。

四:监控和管理进程

在linux下,监控和管理进程的命令有很多。我们只列举其中的四个:

(1)使用ps命令监控系统进程

其中:第一列是UID:用户uid;第二列:pid是进程ID;第三列:PPID表示父进程的ID,第四列:STIME 表示进程的启动时间;第五列:TTY表示进程所属的终端控制台;第六列:TIME表示进程启动后累计使用CPU的时间;第七列:CMD表示正在执行的命令;

还可以通过以下命令查看子进程和父进程之间的关系

其中第三列是进程占用CPU的百分比,第四列是进程占用内存的百分比,第5列进程虚拟大小,第6列表示进程的实际内存大小,最后一列将进程之间的关系用树形结构形象地表示出来,从图中可以看出第一个进程是父进程,其它的都是子进程。

(2)利用pstree监控系统进程

pstree:以树形结构显示程序和进程之间的关系。

pstree [-acnpu] [/]

其中:-a 显示启动每个进程对应的完整命令,包括启动进程的路径、参数等;

-c 不实用精简法显示进程信息,即显示的进程中包括父进程和子进程;

-n 根据进程PID来排序,默认以程序名排序输出

-p 显示进程PID

-u 显示进程对应的用户名

PID即进程对应的PID

user 系统用户名

 

(3)利用top监控系统进程(前面有谈过,可以找一下)

(4)利用lsof监控系统进程与程序

用于列举系统中已经打开的文件。通过lsof,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。

lsof filename 显示使用filename文件的进程;如下图:

显示的是文件/var/log/messages所对应的进程信息;

lsof -c 进程名如图下图所示,显示进程rsyslogd现在打开的文件。其中FD列表示文件描述符,TYPE列显示文件的类型,SIZE列显示文件的大小,NODE列显示本地文件的node码,NAME列显示文件的全部路径或挂载点。

lsof -g gid 显示指定的进程组打开的文件情况;

lsof -p pid :pid是进程号,通过进程号显示程序打开的所有文件及相关进程。

lsof -i 通过监听指定的协议、端口、主机等信息,显示符合条件的进程信息;如图下图所示,显示的是显示监听80端口的进程信息;

(5)利用pgrep查询进程ID

通过程序的名字来查询进程ID的工具,它通过检查程序在系统中活动的进程,输出进程属性匹配命令行上指定条件的进程的ID。语法格式如下:

pgrep 参数选项 command

-l 列出程序名和进程ID

-o 显示进程起始的ID

-n 显示进程终止的ID

-f 可以匹配command中的关键字,即字符串匹配

-G 可以匹配指定组启动的进程对应的ID

如下图所示,第一个实例:查询nginx的程序名以及进程ID;第二个查询nginx的起始进程ID;第三个查询nginx的终止进程ID;第四个查看nginx对应的所有进程ID

;第五个查看mysql组启动的相关进程ID

系统进程知多少_第1张图片

五:任务调度进程

crond 是linux下用来周期性地执行某种任务或等待处理某些事件的一个守护进程,与windows中计划任务类似。当安装完操作系统以后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务。

任务调度分为两类:系统任务调度和用户任务调度

系统任务调度:系统周期性要执行的工作,比如写缓存数据到硬盘、清理日志等;在/etc目录下有一个crontab文件,这个就是系统任务调度等配置文件。

 

系统进程知多少_第2张图片

上图是crontab文件内容;其中shell变量指定来系统要使用哪个shell,这里是bash;path变量指定了系统执行命令的路径;第三行mailto变量指定了crond的任务执行信息将通过电子邮件发送给root

用户;下面注释的部分表示crontab执行间隔时间的配置。

用户任务调度:用户定期要执行的工作,比如用户数据备份,定时邮件提醒等,所有用户定义的crontab文件都保存在/var/spool/cron目录中。其文件名与用户名一致。

crontab工具的使用:

-u user 用来设定某个用户的crontab的服务。此参数一般由root用户来运行

file :file是命令文件的名字,表示将file作为crontab的任务列表文件并载入crontab。

-e 编辑某个用户的crontab文件内容

-l 显示某个用户的crontab内容

-r 从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-I 在删除用户的crontab文件时给出确认提示。

crontab每行的每一个字段代表的含义:前五个字段是时间设定字段,第6个字段是要执行的命令段。

minute:表示分钟

hour:表示小时

day:表示日期1~31

month:月份 1~12

week:表示星期几,0~7,0或者7代表星期日

还可以有一些特殊的字符:

* :代表所有可能的值;

,:可以用逗号隔开的值指定一个列表范围;

- :中杠,可以用整数之间的中杠,表示一个范围;例如:2-6代表2,3,4,5,6

/ :可以用/表示指定时间的间隔频率。例如:0-23/2表示每隔两小时执行一次;同时/也可以和*一起使用,例如:*/10 ,如果用在minute字段中,表示每隔10分钟执行一次。

 

 

六:杀死进程:kill和killall

当需要关闭某些服务或者某些进程处于僵死状态时,就需要关闭这些进程;此时就可以使用kill命令;kill命令的执行原理:首先向操作系统内核发送一个终止信号和终止进程的ID,然后系统内核根据发送的终止信号类型,对进程进行相应的终止操作。

kill 【信号类型】 进程ID

可以通过kill -l 查看所有的信号类型,如下图所示:

系统进程知多少_第3张图片

常用的信号类型有sigkill,对应的数字是9;还有sigterm和sigint,对应的数字分别是15和2;

kill -9 进程ID:表示强制结束进程

kill -2 进程ID:表示结束进程,但不是强制性的。常用的ctrl+c组合发出的就相当于kill -2的信号

kill -15 进程ID:表示正常结束进程,是kill的默认选项;

 

在正常关闭进程的操作中,父进程在自己终止时,会同时调用调用资源关闭子进程,释放内存;而在强制关闭进程的操作中,由于忽略了进程之间的依赖关系,父进程将直接关闭,不去理会子进程,因而这些子进程就成了孤儿进程。未来能让这些孤儿进程的资源得以释放,系统默认将init 进程作为这些孤儿进程的父进程,此时只需要再次执行kill命令关闭相应的子进程即可。

 

killall也是关闭进程的一个命令;与kill不同的是,killall后面跟的是进程的名字,而不是进程的id,因而killall可以终止一组进程。

kill 【信号类型】进程名称

如果想查看更多,更关注公众号:我要一幕天

系统进程知多少_第4张图片

你可能感兴趣的:(linux)