引言
精灵进程又称守护进程。进程负责程序的基本服务,但是我们也希望这种服务能够在后台持续的进程,不会因为用户的切换或者登录终端的关闭而停止。但是首先我们要知道的概念是进程的对话概念。
进程的对话概念
- 从上图中可以看到首先登录shell就是进入一个对话期,创建一个对话。
- 然后在系统中,各种各样的进程被分为各种组,那么其实在方便与进程进行通信(发信号)。
- 前台进程组可以接受控制终端的输入与产生的信号,那么具体指的是什么呢?下面以代码来说明:
这个test1就是前台进程组。
要让这个test1变为后台进程组其实很简单:
可以看到我们已经不能通过控制终端去操作这个test1
但是通过ps -e
依然可以看到test1在后台运行中,但是终端一旦关闭,这个进程就会自动关闭了。
精灵进程的产生流程
- 登录终端得到第一个session,并且首先拥有一个进程组,组长为P1(程序)
- 产生新的会话New session:1、新的用户名登录。2、使用setsid()函数
- 产生新的会话的目的是为了避免控制终端的干扰。
- P1无法调用setsid(),因此P1使用fork(),产生子进程P2来调用setsid()产生新会话。
- P2在New session中,但依然属于P1的进程组,因此在New session中的进程组ID与P1相同。若有信号发送到P1进程组,P2也会收到。
- 为了能够让进程隐秘,P2使用setpgrp()创建新的进程组
- 因此P2进入新的会话,新的进程组。但是P2是新会话的创始人,因此也会受到控制终端的干扰。
- 为了避免控制终端的避免,P2继续fork()一个子进程P3,P3就成为了隐秘进程。
详细的精灵进程代码编写可以参考:
【Linux学习笔记35】教你写精灵进程(附精灵进程模板)
精灵进程的日志
精灵进程会在后台默默地运行,但是如果进程遇到了问题,精灵进程不能从频幕输出,也不能与控制终端交流。因此,精灵进程会将信息写入日志中。
那么在精灵进程创建的封装代码中:
代码运行结果:
一旦信息与之前信息一样,守护进程不会再往日志写入数据