Linux守护进程

什么是守护进程?

守护进程(Daemon)也称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任

务或等待处理某些事情的发生,主要表现为以下两个特点:

1.1.长期运行。守护进程是一种生存期很长的一种进程,它们一般在系统启动时开始运行除非强行终止,否则直到系统关机之前都会保持运行。与守护进程相比,普通进程都是在用户登录或执行程序时创建,在运行结束或用户注销时终止,但守护进程不受用户登录注销的影响,它们将会一直运行着、直到系统关机。

1.2.与控制终端脱离。普通进程都是和控制终端相绑定的,会受到终端的控制、影响;但守护进程它脱离了控制终端,目的就是为了不受到控制终端的控制、影响,同时守护进程也不会将运行过程的信息通过终端显示出来、更

不会通过终端与用户进行交互!

Linux 系统中有很多系统服务,大多数服务都是通过守护进程来实现的,譬如系统日志服务进程syslogd、web 服务器 httpd、邮件服务器 sendmail 和数据库服务器 mysqld 等。守护进程的名字通常以字母 d 结尾 (守护进程的英

文单词首字母 Daemon)。

如何编写守护进程?“

守护进程的重点在于脱离控制终端,但是除了这个关键点之外,还需要注意其它的一些问题编写守护进程一般包括

如下几个步骤:

2.1.创建子进程、终止父进程

在第2步中要调用setsid 创建一个新的会话,然而调用 setsid 的进程不能是进程组组长进程,这个是先决条件!因为父进程是进程组的组长进程,所以不能调用 setsid 函数,子进程继承了父进程的进程组D,它并不是组长进

程,所以子进程它满足调用 setsid 函数的要求。子进程创建之后,父进程就没有了,所以直接终止即可

2.2.子进程调用 setsid 创建新的会话

这一步是关键,守护进程的重点就在于脱离控制终端,子进程通过调用 setsid 函数创建新会话,脱离控制终端,成为新会话的首领进程、同时也是新进程组的组长进程。“子进程会继承父进程的进程组 D、会话D(也就是继承父进程的控制终端),所以这里调用setsid 有三个作用:让子进程脱离原进程组(成为新进程组的组长进程)、让进程脱离原会话(成为新会话的首领进程)、脱离控制终端。

2.3.将工作目录更改为”/”根目录

子进程会继承父进程的当前工作目录,由于守护进程在运行过程中,当前工作目录所在的文件系统不能被卸载、也不能被删除,否则会对守护进程的运行造成很多的麻烦,所以必须要保证守护进程的当前工作目录在其运行过程中必须存在,因此通常的做法是让

“/”作为守护进程的当前工作目录,不与任何文件系统关联,当然也可以指定其它特定目录作为守护进程的工作目录,譬如/mnt。

2.4.重新设置文件权限掩码 umask

文件权限掩码 umask 用于对新建文件的权限位进行屏蔽,子进程会继承父进程的文件权限掩码。我们需要将守护进程的文件权限掩码设置为0(新建文件实际权限: mode& ~umask)避免新建文件时,文件的某些操作权限位会被屏蔽掉!

2.5关闭打开的文件描述符

子进程会继承父进程的所有文件描述符,这些被打开的文件可能永远都不会被守护进程读或写,但这些文件描述符一样占用着系统资源,所以必须关闭这些文件描述符,这使得守护进程不再持有从父进程继承过来的任何文件描述符。

重点是关闭0(标准输入)、1(标准输出)、2(标准错误)这三个文件描述符。使得守护进程的输出信息不能通过终端显示出来(守护进程通常会使用日志来记录程序运行过程中的输出信息)、也不能通过终端与用户进行交互。

2.6.忽略 SIGCHLD 信号

这个步骤并不是必须的,可以根据实际情况来确定要不要忽略 SIGCHLD 信号;但对于某些进程,特别是并发服务器进程往往是特别重要的,这些服务器进程会创建子进程I譬如服务器进程在收到客户端请求的时会创建子进程去处理这个请求),如果子进程终止,父进程没有去回收,则子进程将成为僵尸进程,如果父进程等待子进程终止、然后回收子进程,这又会增加父进程的负担、也就是增加服务器的负担,影响服务器进程的并发性能。“通常的做法就是,忽略 SIGCHLD 信号,将 SIGCHLD 信号的处理方式设置为 SIG IGN(表示忽略)。忽略SIGCHLD信号会产生一个有意思的情况:子进程终止后,直接转交给init 进程处理、让它去回收,这样既不会产生僵尸进程、又不会增加父进程的负担、影响服务器进程的并发性能。注意,虽然 SIGCHLD 信号的系统默认操作就是将其忽略,但显示设置忽略该信号,会让系统执行上面的一个操作;在这方面,系统对 SIGCHLD 信号的处理非常独特 (系统对这个SIGCHLD 信号的一个特殊的处理),不同于其他信号!!!e

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值