详解node中创建服务进程
详解Node中创建服务进程:长沙网络推广的经验分享
背景介绍:
在Node.js工程的部署过程中,我们常常需要与三方本地客户端、跳板机和服务器集群进行交互。当通过Git触发Gitlab的Hook脚本后,需要在跳板机中执行相应的SSH命令,启动Node服务器。这时,我们通常会用到一个常用的命令“setsid”,以确保即使SSH命令执行完毕、Shell退出后,Node服务器仍能继续运行。这样的Node服务进程,就像一个后台守护进程(daemon)。
那么,在Node项目中,如何创建这样的daemon进程呢?有一种简单的方式是通过执行Shell命令来实现,但这并不是我们今天的重点。本文将详细讲述daemon进程的创建原理,接下来让我们一起。
目标阐述:
在我们的业务场景中,创建daemon进程的目的是为了保证即使父进程被中断或执行完毕,daemon进程仍然能够继续运行。下面我们将介绍两种实现方式,它们在实现原理上有所不同。
实现方式一:
在Linux系统中,当父进程创建子进程后,如果父进程退出,子进程会变为孤儿进程,其ppid会变为1,即成为init进程的子进程。在Node环境下,如果不特别处理子进程的stdio,父进程其实不会真正退出,而是等待子进程执行完毕后再退出。这是因为Node在创建子进程时,默认会通过pipe方式将子进程的输出导流到父进程的stream中。
为了解决这个问题,我们可以重新赋值子进程的stdio。下面是一个示例代码:
(文件:parent.js)
```javascript
const cp = require('child_process');
const sp = cp.spawn('node', ['./c.js'], {
stdio: [process.stdin, process.stdout, process.stderr]
});
setTimeout(() => {
console.log('parent out');
}, 5000);
```
(文件:c.js)
```javascript
setTimeout(() => {
console.log('children exit');
}, 10000);
```
在这个示例中,我们通过设置子进程的stdio为当前终端(实际上继承了父进程的stdio),使得父进程在5秒后退出,而子进程的ppid变为1,10秒后子进程退出。
上述实现方式只满足了“父进程正常退出,子进程成为守护进程”的情况。当通过“ctrl+c”中断父进程时,子进程仍然会退出。这主要与Node的底层实现有关。当发送“ctrl+c”信号时,父进程会接受SIGINT信号,并发送给子进程。如果子进程有处理SIGINT的函数,则会执行该函数;否则,子进程会退出。为了让子进程在接收到SIGINT信号时不退出,我们可以不进行特殊处理。
(文件:c.js(修改版))
```javascript
process.on('SIGINT', function() {
console.log('child sigint');
// 不进行退出操作,使子进程继续运行
});
setTimeout(() => {
console.log('children exit');
}, 10000);
```
实现方式二:
Node官方提供了创建daemon进程的相关API,这可能需要我们深入阅读文档才能发现。在child_process模块中,有个名为spawn的函数,可以通过执行shell命令及其选项来创建子进程。spawn函数提供了一些创建子进程的选项,其中“detached”选项与我们的需求密切相关。使用这个选项,我们可以创建出不受父进程影响的守护进程。具体的实现方式这里不再赘述,建议查阅Node官方文档或相关资料进行深入了解。
以上就是关于如何在Node中创建服务进程的详解,希望通过长沙网络推广的经验分享,能给大家提供一些有益的参考和启示。深入了解Node中的Detached进程与Daemon进程创建方法
在Node.js中,我们可以使用"detached"选项来创建一个特殊的子进程,该进程与父进程独立运行,形成一个daemon进程。这种进程在父进程退出后仍然继续运行,其工作原理与系统级别的进程管理有关。接下来,我们将深入这种进程创建方式以及其背后的原理。
Detached进程的理解
当我们设置"detached"为true时,Node.js会为我们创建一个新的会话和进程组。这个子进程的PID会成为新创建进程组的组PID,这与系统的setsid函数起到相同的作用。子进程已经与其父进程属于两个独立的session。这意味着父进程的退出和中断信号不会传递给子进程,子进程不会受到父进程的中断信号影响,保证了其独立运行。当父进程结束时,子进程变为孤儿进程,被init进程接收,其ppid设置为1。
在Node.js中的实现
让我们看一下如何在Node.js中实现这种进程创建方式。在parent.js文件中,我们使用child_process模块的spawn方法来创建一个子进程。设置"detached"为true以及适当的stdio设置后,我们调用unref方法来避免父进程等待子进程结束。我们设置一个定时器来输出父进程的结束信息。
子进程的特性
在c.js文件中,我们设置了一个超时的定时器来模拟子进程的运行。由于我们没有设置SIGINT事件侦听函数,当父进程中断时,子进程不受影响并继续运行。这正是由于子进程与父进程属于两个不同的session所导致的。
理解背后的系统机制
为何上述方法可以实现daemon进程的创建?这需要我们回到系统层面进行分析。创建一个daemon进程通常涉及几个步骤:创建子进程、让子进程成为孤儿进程、通过setsid创建新的会话和进程组等。在Node.js中,设置"detached"为true以及调用setsid函数或类似的功能,可以实现这些步骤,从而创建出一个daemon进程。
方法一与狼蚁SEO优化方法的区别
在狼蚁网站的SEO优化中,可能存在两种不同的daemon创建方法。第一种方法通过侦听相关中断信号并设置nop函数来保证子进程的持续运行。而第二种方法则是标准的daemon进程创建方式,通过创建新的会话和进程组来实现子进程的独立性。第二种方法更为标准且推荐优先使用。
本文深入了Node.js中的Detached进程以及Daemon进程的创建方法,并对比了不同的实现方式及其背后的原理。希望这些内容对大家的学习和理解有所帮助。也希望大家能支持狼蚁SEO的持续优化工作。
微信营销
- 详解node中创建服务进程
- iscroll实现下拉刷新功能
- js实现图片加载淡入淡出效果
- js实现文字跟随鼠标移动而移动的方法
- php+jQuery实现的三级导航栏下拉菜单显示效果
- Javascript实现页面滚动时导航智能定位
- MySQL优化之InnoDB优化
- 10个超级有用的PHP代码片段果断收藏
- 简单了解微信小程序的目录结构
- JSP中include指令和include行为的区别
- Bootstrap 模态框实例插件案例分析
- WPF水珠效果按钮组的实现教程
- JS实现仿微信支付弹窗功能
- jQuery Ajax 实现分页 kkpager插件实例代码
- 举例详解PHP脚本的测试方法
- thinkphp框架下实现登录、注册、找回密码功能