Linux守护进程总结(1) : 基本理论

守护进程(daemon):是一种“潜伏”在后台,存活周期较长的进程。对系统使用者来说它的行为是透明的(它本身不透明,用ps命令可以看到),就像幽灵一样。其父亲通常是上帝(init进程)。

为什么需要守护进程这种形式呢?因为我们有时会开发一些所谓的“服务”程序,这种程序启动后不需要与系统使用者进行交互(调试的时候通常需要)。对于这个服务进程来说,一个客户何时来请求服务,是不得而知的。服务进程能做的事情就是守着,有客户进来,它就服务,没客户就接着等。这个驻守的进程,肯定不可以随随便便地就没了,要没也只能是出于我们的意愿故意将其终止的。然而,普通进程是终端一关闭,它就终止了,这显然不符合要求。

另外,既然该类进程不会与系统使用者进行交互。那么,它就不应该占有终端前台。也就是说,它应在启动成功后,立即交出终端前台,切换到后台,以免影响其它进程的正常运行。

原理

在Linux中,当用户完成终端登陆后,login进程就会启动当前用户的shell进程,它是终端登陆后,被拉起的第一个进程。这个shell就是此次会话的创始人,它被叫做“会话leader”。会话leader会与当前终端自动建立关联,这个被关联的终端就成为该会话的控制终端。相应地,这个会话leader又被叫做“控制进程”。

此后,由这个会话leader启动的进程,都隶属于这个会话,它们是这个会话leader的子进程。这些进程共享与该会话相关联的这个终端。

一旦终端关闭,控制进程就会收到SIGHUP信号,同时,控制进程会将SIGHUP信号发送给由它拉起的所有进程(它的子进程)。也就是说,终端一旦关闭,与其相关联的那个会话中的所有进程都会收到SIGHUP信号,其默认行为就是终止进程。

一个守护进程之所以能处于后台,且不与终端共存亡。是因为它脱离了启动自己的那个会话leader,自己领导了一个与任何控制终端都无关联的会话,也就是说它其实是一个没有控制终端的进程(没有控制终端,进程自然运行于后台)。没有来自控制终端的“打扰”(终端关闭时产生的SIGHUP信号),这个进程就可以安心地驻守在后台了。

守护进程所在的这个会话只有一个进程组,这个组里只有一个进程,就是它自己,也就是说,它是会话leader兼进程组组长。

相关概念

进程组:进程的集合。进程组也叫作业。每个进程都隶属于一个组,一个组里有至少一个进程存在。进程组的首个进程即为该组的组长进程,组ID(GID)等于组长进程的进程ID(PID)。也就是说,如果一个进程的PID等于其GID的话,那么它就是其所在进程组的组长进程。

进程组的存放与组长进程的存亡没有关系,只有进程组里最后一个进程终止的时候,该组才会消亡。

会话:进程组的集合。登陆终端成功后,就发起了一个会话,会话中的首个进程(shell进程),被叫做会话leader。可将该会话leader的进程ID视为该会话的会话ID。会话leader总是一个进程组的组长进程,因此,会话leader的进程ID等于会话leader所在的进程组ID等于会话ID。会话leader会关联到当前终端,这个终端就是这个会话的控制终端,会话leader即为控制进程。


Next-Linux守护进程总结(2):实现



References: