chst365's blog chst365's blog
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

chst365

DIV工程师
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Node

    • 进程通信
    • 流机制
    • 事件循环
    • 守护进程
      • 守护进程的启动方式
        • setsid
      • Nodejs 中启动子进程方法
      • Nodejs中setsid的调用
      • 总结
    • 异常处理
    • Nodejs模块机制
    • pipe原理
    • require原理
  • 后端
  • Node
chst365
2022-08-31
目录

守护进程

# 守护进程的启动方式

如果不在nodejs环境中,我们如何创建守护进程?过程如下:

  1. 创建一个进程A
  2. 在进程A中创建进程B,可使用fork方式或其他方法
  3. 对进程B执行setsid方法
  4. 进程A退出,进程B由init进程接管。此时进程B为守护进程

# setsid

setsid主要完成三件事:

  1. 该进程变成一个新会话的会话领导
  2. 该进程变成一个新进程组的组长
  3. 该进程没有控制终端 然而,nodejs中并没有对setsid方法的直接封装

# Nodejs 中启动子进程方法

借助child_process中的spawn即可创建子进程,方法如下:

var spawn = require('child_process').spawn;
var process = require('process');

var p = spawn('node',['b.js']);
console.log(process.pid, p.pid);
1
2
3
4
5

注意,这里只打印当前进程的PID和子进程的PID,同时为了观察效果,我并没有将父进程退出。

b.js 中代码很简单,打开一个资源,并不停的写入数据。

var fs = require('fs');
var process = require('process');

fs.open("/Users/mebius/Desktop/log.txt",'w',function(err, fd){
	console.log(fd);
	while(true)
	{
		fs.write(fd,process.pid+"\n",function(){});
	}
});
1
2
3
4
5
6
7
8
9
10

运行后的效果如图: 我们来看以下 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);
1
2
3
4
5
6
7
8

在 spawn 的第三个参数中,可以设置 detached 属性,如果该属性为true,则会调用 setsid 方法。这样就满足我们对守护进程的要求。

在此运行命令。

查看 top 命令

可以看到,当前仅存在一个PID为17062的进程,这个进程就是我们要的守护进程。

# 总结

守护进程最重要的是稳定,如果守护进程挂掉,那么其管理的子进程都将变为孤儿进程,同时被init进程接管,这是我们不愿意看到的。于此同时,守护进程对于子进程的管理也是有非常多的发挥余地的,例如PM2中,将一个进程同时启动4次,达到CPU多核使用的目的(很有可能你的进程在同一核中运行),进程挂掉后自动重启等等,这些事情等着我们去造轮子。 总体来说,Nodejs启动守护进程方式比较简单,默认所暴露的API也屏蔽了很多系统级别API,使得大家使用上更加方便,但没有接触过Linux的人在理解上有一些复杂。

#后端#Node
上次更新: 2022/08/31, 09:41:27
事件循环
异常处理

← 事件循环 异常处理→

最近更新
01
面试官
03-27
02
this&指针&作用域&闭包
03-27
03
前端
03-27
更多文章>
Theme by Vdoing | Copyright © 2019-2025 chst365 | 豫ICP备17031889号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式