美文网首页
Nodejs 进程信号

Nodejs 进程信号

作者: 黑曼巴yk | 来源:发表于2019-10-16 15:15 被阅读0次

前言

首先我们来看一个简单的master/worker的例子

// master.js
const http = require("http");
const { fork } = require("child_process");

const server = http.createServer((req, res) => {
  const work = fork("./qa/work.js");
  work.on("message", m => {
    console.log("master 接收到返回结果 :", m);
    if (typeof m === "object" && m.type === "fib") {
      work.kill();
      res.end(m.data.toString());
    }
  });

  work.on("close", (numver, signal) => {
    console.log("work 退出", numver, signal);
  });

  // 子进程收到的内容为 { type: "fib", data: "" }
  work.send({ type: "fib", data: 1 });
});
server.listen(3002, () => {
  console.log("服务启动成功");
});

worker程序

// worker.js
console.log("子线程已经启动");
function fib(num) {
  if (num === 0) return 0;
  if (num === 1) return 1;
  return fib(num - 2) + fib(num - 1);
}

process.on("message", m => {
  console.log("work 接收到参数 :", m);
  if (typeof m === "object" && m.type === "fib") {
    const result = fib(m.data);
    process.send({ type: "fib", data: result });
  }
});

process.on("exit", function(code) {
  // TODO 这里可以主动释放其他资源 如zookeeper连接等
  if (code === 1000) {
    console.error("process:uncaughtException");
  } else if (code === 1001) {
    console.error("process:SIGINT");
  } else if (code === 1002) {
    console.error("process:SIGTERM");
  } else {
    console.error("process:unknown");
  }
});
process.on("uncaughtException", function(e) {
  console.log(e);
  // 异常可以选择不退出
  process.exit(1000);
});
process.on("SIGINT", function() {
  process.exit(1001);
});

process.on("SIGTERM", function() {
  process.exit(1002);
});

process.on("SIGHUP", () => {
  console.log("接收到退出指令");
});

信号接收

首先无论在子进程还是父进程都可以接收linux的信号SIGINT,SIGTERM,SIGHUP等。

process.on("SIGINT", function() {
  process.exit(1001);
});

process.on("SIGTERM", function() {
  process.exit(1002);
});

process.on("SIGHUP", () => {
  console.log("接收到退出指令");
});

退出信号

只要是程序能够监听到的退出信号。我们都可以统一通过监听exit来处理程序

process.on("exit", function(code) {
    console.log(code);
});

父进程对子进程的管理

  1. kill
    父进程可以直接kill 子进程,只要拿到子进程的句柄。worker.kill
  2. 监听子进程关闭信号
worker.on('close', (signal) => {
  console.log(signal);
});

相关文章

  • Nodejs 进程信号

    前言 首先我们来看一个简单的master/worker的例子 worker程序 信号接收 首先无论在子进程还是父进...

  • Nodejs 信号

    前言 当Nodejs 进程接收一个信号时,会触发信号事件。我们通过man kill来查看所有的信号事件 常用信号解...

  • signal

    信号: 信号是组概念,发送方和接收方需要配对存在,比如进程A发送信号X给进程B,进程B接收信号按信号处理函数进行响...

  • C/C++面试题

    1, 信号的声明周期 答: 信号的产生 -> 信号在进程中注册 -> 信号在进程中的注销 -> 执行信号处理函数 ...

  • 一些面试题

    1, 信号的声明周期 答: 信号的产生 -> 信号在进程中注册 -> 信号在进程中的注销 -> 执行信号处理函数 ...

  • nodejs进程

  • 五、进程间通信

    信号信号是linux操作系统进程间通信的一种方式,一个应用进程可以接受、发送信号给另一个进程,当进程捕获到某个信号...

  • linux信号以及core

    何为信号 信号(signal)用于通知进程发生了某种情况。进程有以下3种处理信号的方式: 忽略信号。有些信号表示硬...

  • 进程通信之信号

    相关API接口 发送信号给指定进程 实例 给调用进程发送信号 实例 给调用进程发送SIGABRT信号 实例 设定闹...

  • 进程信号

    kill -n pid 其实就是unix系统给指定的pid的进程发送信号的一个过程,9只是其中一个信号,程序执行阶...

网友评论

      本文标题:Nodejs 进程信号

      本文链接:https://www.haomeiwen.com/subject/jmcumctx.html