【新手求助】如何用Nodejs写一个守护进程

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

【新手求助】如何用Nodejs写一个守护进程

想用node一个守护进程的demo。目前看到的代码不是web服务就是net服务,都是依靠系统提供的listen接口来实现程序的持久执行的。

不借助http、net模块,如何写出一个event loop呢?

我能给出的方案是:

function Worker()
{
    this.MaxIterations = 1000000;
    this.Enabled = true;    
    this.condition = true;
    this.iteration = 0;
    this.Loop = function()
    {
        if (this.condition 
            && this.Enabled 
            && this.iteration++ < this.MaxIterations)
        {
            console.log(this.iteration);
            setTimeout(this.Loop.bind(this),0);
        }
    };  
    this.Stop = function()
    {
        this.Enabled = false;
    };
}
var w = new Worker();
setTimeout(w.Loop.bind(w), 0);
setTimeout(w.Stop.bind(w), 3000);

大家有更好的吗?


7 回复

当然可以!下面是一个更简洁且更接近守护进程概念的Node.js示例代码。守护进程通常是指一个在后台运行并且不会因为用户退出终端而终止的进程。在这个例子中,我们将使用child_process模块创建一个新的子进程,并确保它在父进程退出时仍然继续运行。

示例代码

const { fork } = require('child_process');

// 创建一个新的子进程
const child = fork('./worker.js');

// 设置定时器,在3秒后向子进程发送信号以停止它
setTimeout(() => {
  child.kill('SIGTERM');
}, 3000);

// 监听子进程的退出事件
child.on('exit', (code, signal) => {
  console.log(`子进程已退出,退出码: ${code},终止信号: ${signal}`);
});

worker.js 文件内容

console.log('守护进程已启动');

// 模拟一个无限循环的任务
setInterval(() => {
  console.log('守护进程正在运行...');
}, 1000);

process.on('SIGTERM', () => {
  console.log('收到终止信号,开始清理资源...');
  process.exit(0);
});

解释

  1. 创建子进程

    • 使用fork方法创建一个新的子进程,并指定该子进程将运行的脚本文件(./worker.js)。
  2. 设置定时器

    • 使用setTimeout方法在3秒后向子进程发送SIGTERM信号,模拟实际场景中的定时任务。
  3. 监听子进程退出

    • 监听子进程的exit事件,以便在子进程退出时打印相关信息。
  4. 子进程逻辑

    • worker.js文件中,首先打印一条消息表示守护进程已经启动。
    • 使用setInterval模拟一个持续运行的任务,每隔一秒打印一次消息。
    • 添加对SIGTERM信号的处理,当接收到终止信号时,打印一条清理信息并退出进程。

这样,我们就可以实现一个简单的守护进程,即使父进程退出了,子进程依然会继续运行。


Node进程就是在eventloop下运行的啊

怎样让程序永远循环下去,并能处理event

这样行不行的…

delay = (t, f) -> setTimeout f, t
show = console.log

run = yes

worker = (n) -> if n < 10000000 and run show n show process.memoryUsage() process.nextTick -> worker (n + 1)

worker 1 delay 10000, -> run = no

奇怪我一直觉得 Node 用递归总是会栈溢出,’ 这段代码又没报错, 这是怎么回事?

应该是process.nextTick的调用栈不太一样吧。 谁来证实一下。

function start(){ console.log(‘Mother process is running.’);

    var ls = require('child_process').spawn('node', ['app.js']);
ls.stdout.on('data', function (data)
{
        console.log(data.toString());
});

ls.stderr.on('data', function (data)
{
        console.log(data.toString());
});

ls.on('exit', function (code)
{
        console.log('child process exited with code ' + code);
        delete(ls);
        ls = null;
        setTimeout(start,3000);
});

}

要创建一个简单的Node.js守护进程,你可以使用setIntervalsetTimeout来实现一个事件循环,而不依赖于HTTP或网络模块。你的代码已经提供了一个基本的思路,但可以进一步简化和优化。

下面是一个更简洁的示例代码,展示如何使用setInterval来创建一个持续运行的事件循环:

function Worker() {
    this.MaxIterations = 1000000;
    this.iteration = 0;

    this.loop = () => {
        if (this.iteration < this.MaxIterations) {
            console.log(`Iteration: ${this.iteration}`);
            this.iteration++;
        } else {
            clearInterval(this.interval);
            console.log('Reached max iterations, stopping.');
        }
    };

    // Start the loop
    this.start = () => {
        this.interval = setInterval(this.loop, 1000); // Run every second
    };

    // Stop the loop
    this.stop = () => {
        clearInterval(this.interval);
    };
}

const worker = new Worker();
worker.start();

// Stop after 3 seconds
setTimeout(() => {
    worker.stop();
}, 3000);

解释:

  1. Worker构造函数:定义了最大迭代次数和当前迭代次数。
  2. loop方法:每次调用时打印当前迭代次数,并递增迭代计数器。如果达到最大迭代次数,则停止循环。
  3. start方法:启动事件循环,使用setInterval每秒调用一次loop方法。
  4. stop方法:停止事件循环,清除定时器。

通过这种方式,你可以创建一个简单的守护进程,它会持续运行直到达到预设的最大迭代次数或被显式停止。这种做法避免了使用HTTP或网络模块,专注于创建一个简单的事件循环。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!