守护进程

一、什么是守护进程

 

守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。守护进程脱离终端的主要原因有两点:
(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。
(2)其他用户登录该终端后,以前的守护进程的错误信息不应出现,
由终端上的一些键所产生的信号(如中断信号),
不应对以前从该终端上启动的任何守护进程造成影响。


要注意守护进程与后台运行程序(即加&启动的程序)的区别。

 


创建守护进程的过程:
1. 调用fork创建子进程。父进程终止,让子进程在后台继续执行。
2. 子进程调用setsid产生新会话期并失去控制终端调用setsid()使子进程进程成为新会话组长和新的进程组长,同时失去控制终端。
3. 忽略SIGHUP信号。会话组长进程终止会向其他进程发该信号,造成其他进程终止。
4. 调用fork再创建子进程。子进程终止,子子进程继续执行,由于子子进程不再是会话组长,从而禁止进程重新打开控制终端。
5. 改变当前工作目录为根目录。一般将工作目录改变到根目录,这样进程的启动目录也可以被卸掉。
6. 关闭打开的文件描述符,打开一个空设备,并复制到标准输出和标准错误上。 避免调用的一些库函数依然向屏幕输出信息。
7. 重设文件创建掩码清除从父进程那里继承来的文件创建掩码,设为0。
8. 用openlog函数建立与syslogd的连接。

 

二、守护进程与后台程序区别:

 

(a)守护进程已经完全脱离终端控制台了,而后台程序并未完全脱离终端,在终端未关闭前还是会往终端输出结果
(b)守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohup command & 格式运行才能避免影响
(c)守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。

 

 

 

三、Nodejs中启动守护进程的方式

 

守护进程的启动方式

如果不在Nodejs环境中,我们如何创建守护进程?过程如下:
1. 创建一个进程A。
2. 在进程A中创建进程B,我们可以使用fork方式,或者其他方法。
3. 对进程B执行 setsid 方法。
4. 进程A退出,进程B由init进程接管。此时进程B为守护进程。
setsid详解
setsid 主要完成三件事:
1. 该进程变成一个新会话的会话领导。
2. 该进程变成一个新进程组的组长。
3. 该进程没有控制终端。
然而,Nodejs中并没有对 setsid 方法的直接封装,翻阅文档发现有一个地方是可以调用该方法的。
Nodejs中启动子进程方法
借助 clild_process 中的 spawn 即可创建子进程,方法如下:
var spawn = require('child_process').spawn;
var process = require('process');

var p = spawn('node',['b.js']);
console.log(process.pid, p.pid);
top命令 看一看到,此时父进程PID为17055,子进程的PPID为17055,PID为17056.


Nodejs中setsid的调用
到此为止,守护进程已经完成一半,下面要调用setsid方法,并且退出父进程。
代码修改如下:
var spawn = require('child_process').spawn;
var process = require('process');

var p = spawn('node',['b.js'],{
detached : true
});
console.log(process.pid, p.pid);
process.exit(0);
在 spawn 的第三个参数中,可以设置 detached 属性,如果该属性为true,则会调用 setsid 方法。这样就满足我们对守护进程的要求。

 

上一篇:UnityEditor批量替换文件夹下所有问价的后缀名


下一篇:Linux expect详解【转】