Linux之什么是进程

Linux进程详解:从at到crond,再到守护进程

温故:

         at: at是个可以处理仅执行一次就结束的命令,不过要执行at的时候,需要有atd这个服务,不然就会失效,要注意的是有些版本的Linux默认没有开启这个服务,不过Centos都是默认开启的。
        crontab: crontab这个命令所设置的任务将会一直循环下去,循环的时间可以是分钟、小时、每月、每年等等,crontab除了可以使用命令执行外,还可以编辑/etc/crontab来支持。和at命令一样,它也需要一个服务来支持其运行,这个服务就是crond.
        如果大家对于这部分内容感兴趣,请看我的《Linux之crontab与at

知新:

        今天要讲的是Linux的进程问题,大家都知道Linux下面所有的命令以及你能够执行的操作都与权限有关,而系统正是使用UID、GID和文件的属性等判断操作者的权限。因为在Linux系统中,只要你触发任何一个事件,系统都会将它定义为一个进程,并且给予这个进程一个ID,也就是PID,同时还要根据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。从此以后这个PID能够在系统上执行的操作就与这个PID的权限相关。


一、进程与程序

        接下来主要给大家讲一件什么是进程,什么是程序。我们知道,执行一个程序或者命令,就会触发事件并且形成一个PID,但是什么才是程序呢?其实很简单,因为系统只认识二进制文件,所以被执行的二进制文件就是程序。程序和进程的关系可以简单的理解为放置在物理磁盘中的程序被用户的执行触发后会加载到内存中成为一个个体,这个个体就是进程。这里举一个简单的例子:当前系统中有两个用户分别是root和gao,这两者登录系统时都会执行bin/bash,系统就会分别给与一个PID(假设此时root用户的PID是1234,gao用户的PID是2234),这个PID就是根据用户的UID/GID的权限而来,接下来当这个进程执行其他的任务时,比如创建一个文件夹,那么由这个进程衍生出的其他进程一般情况下也会沿用这个进程的相关权限。上面的一段话提到了“进程衍生出的其他进程”,其实这个说的就是子进程,还是用刚才的例子,当我们使用root用户执行bash登录系统的时候,系统会给这个进程分配一个PID,然后进入系统之后,我们又使用touch命令创建了一个文件夹,创建文件夹的这个动作同样也会被分配一个进程号,前者就称为父进程,后者就是子进程,因此我要说的是:进程之间是有相关性的。
    那么如何判断父进程与子进程呢,就要通过PID与PPID(partent PID),如下图
在这里插入图片描述
    看一下上面的图:当我第一次执行ps -l的时候,输出的内容中显示第二个进程的父进程是上一个进程。然后我执行了一次【bash】    ,再去执行ps -l可以看到同样有趣的现象。这就说明了进程之间的相关性。
        问题:有时候明明将一个有问题的进程删掉了,但是过了一段时间这个进程就又出现了,而且进程号也变了,为什么???这个时候你就要往两个方向考虑,第一个方向是计划任务,这里就和前面讲过的crontab联系上了,确认一下是否是由于计划任务的存在一直导致该进程出现,第二个方向就是今天一直在说的父进程,极有可能是因为父进程的存在,会在一段时间后触发子进程,这时如果非要对子进程进行处理,可能就需要对父进程下手了,毕竟有句话说得好“擒贼先擒王”。
        刚刚说了父进程与子进程的关系,然后呢再来聊聊子进程是如何产生的,对于这个产生子进程的过程我们将其称为“fork and exec”,举个例子可能更好理解一些,假如现在有一个父进程AAA,PID为X,这时系统会以fork的方式复制一个与父进程相同的"临时进程",这个临时进程与父进程唯一的差别就是PID不同,它的名字也是AAA,PID为Y,PPID为X,接下来临时进程会以exec的方式加载实际要执行的进程,然后产生新的进程,名称更改为BBB,子进程就这样产生了。
在这里插入图片描述
        关于进程的概念讲到这里,大家应该都没有问题了。说的简单一些,我们之前讲到的touch文件,chmod修改权限,useradd增加用户等等都是进程的执行过程,不过这些进程的存在时间都是短暂的,执行完就消失。那么有没有某些进程是一直存在的呢?答案是肯定的,不仅有还有很多。比如上一篇文章中我所讲到的crontab计划任务,系统中负责扫描etc/crontab以及一些相关配置文件的进程就是crond,它就是一直存在的进程,如果不是一直存在又怎么实现对计划任务的扫描呢。我们可以将这种可以一直在后台启动并且一直运行的进程亲切的称之为【常驻在内存中的进程】,也就是大家尝尝提到的“服务”。系统的服务是非常多的,大致可以分为两类,一类是系统自身所需要的服务,像我刚刚提到的crond,还有一类就是负责网络连接的服务,这种负责网络连接的服务在启动后一般都会产生一个负责网络监听的端口。
        问题:有没有想过crontab的进程名称为什么不是cron或者at,而是crond,为什么要加上字母"d"?这样做的好处就是可以方便我们识别出它是一个daemon进程,daemon进程又称为守护 进程,是在系统 启动就运行,系统关闭才停止的进程,独立于终端之外,不与客户端交互。一般进程在关闭终端后就停止了,而daemon进程不会停止。因为daemon进程独立于终端,故使用【ps axj】命令查看进程时,其终端名(TTY)显示为?,终端前台进程组ID(TPGID)显示为-1 
    在这里插入图片描述
        我们之前多次提到过Linux可以实现多人多任务环境。现在明白了吗,正是因为有了PID的存在才有了多人多任务环境的基础,每个人可以在自己的任务环境中“为所欲为”。关于进程,linux还有一个比较大的优点,就是Linux基本不会出现宕机,从进程的角度来说,Linux可以在任何时候,将某个困住的进程杀掉。你可能会问了,那如果正巧是在登陆的时候就显示错误信息挂掉了怎么办?这个时候Linux的优势就体现出来了,Linux默认提供了6个终端命令行登录界面以及一个图形界面,此时就可以使用【alt】+【F1】……【F7】,随意切换到其他的界面,然后使用ps -aux找到刚刚错误的进程将之kill掉。
         最后要说的就是对“多人多任务环境”这句话的理解,注意这句话并不是说N个用户就只能有N个用户环境,就是说在同一个bash下面是可以执行多个任务的.比如我下面举的例子
  在这里插入图片描述
        首先我touch了一个文件夹file,在其中添加了内容为pppppppppppppppppp,又创建了另一个文件夹file2,并添加内容为oooooooooooooooooo,然后执行了【\cp -rf  file   file2  &】,最后发现文件被复制成功了。**但是**这里要看到两个问题,第一是开始的时候第一次输入命令是【cp -rf  file   file2  &】,图中后者与前者相比多了一个【\】,真正的原因如下图所述:

在这里插入图片描述
  
        问题:为什么在执行cp命令的时候要加上【&】呢,其实这个不是必须加的,之所以加上它是为了证明上面说的“同一个bash下面是可以执行多个任务的”这个结论,因为在Linux中【&】的意义就是后台执行。你可以仔细看看,加上【&】与不加【&】输出的结果是不一样的。
        今天关于进程的初步认识就讲到这里,改日继续。

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金陵大掌柜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值