详解node中创建服务进程

网络营销 2025-04-20 12:53www.168986.cn短视频营销

详解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的持续优化工作。

上一篇:iscroll实现下拉刷新功能 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by