【问题标题】:node child process: will it always terminate by itself?节点子进程:它总是会自行终止吗?
【发布时间】:2016-09-16 03:40:28
【问题描述】:

我有这样的代码来生成子进程:

const spawn = require('child_process').spawn;
const ls = spawn('ls', ['-lh', '/usr'], {
    detached: true
});

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls..on('error', (data) => {
  console.log(`error: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

到目前为止,我可以从 stdout 和 stderr 控制台消息,并在完成任务后自动退出。

我的问题是:

  1. 什么情况下会去'error'事件?

  2. 子进程是否可能无法终止?如果是这样,什么时候会发生?

  3. 如果发生情况 2,当我的主进程已经终止时,如何杀死这些子进程?

【问题讨论】:

  • 如果您需要澄清时可以提出与我的答案相关的问题,或者如果有道理就接受它作为答案,那就太好了。

标签: node.js child-process


【解决方案1】:
  1. 每当ls 命令或进程出错时,子进程都会出错。因此,如果/user 不存在,则该过程将出错然后死亡。当您在 Node 中生成子进程时,它的行为方式与您在命令行中执行命令的方式相同。大多数进程都会因错误而死。这真的取决于。您必须阅读 linux 或 unix 或您正在使用的任何操作系统的文档,以了解发生错误时会发生什么。但是这些系统级别的命令应该死掉 对于像ls 这样的简单命令,它是相当安全的。如果它出错,它就会死掉。结束。

  2. 子进程可能不会终止。很难确切地说子进程何时不会终止。任何各种各样的事情都可能导致这种情况。例如,您分叉了某个进程但从未关闭它,或者子进程由于某种原因陷入某种无限循环。一些进程虽然已启动,但会无限期地继续,只能手动关闭。

  3. 如果第 2 种情况发生,您有几种方法可以杀死它。在示例中, ls javascript 变量引用了表示进程的对象。出于好奇,您可以将ls 对象记录到命令行并查看其中的所有属性。所以一般来说,每当你调用spawn(),它都会返回给你这种子进程对象。在 Node 中,杀死进程最简单的方法是在子进程对象上调用 kill() 函数。因此,在这种情况下,您可以调用ls.kill(signal) 对于信号,您可以使用'SIGINT''SIGTERM',我认为'SIGHUP' 也可以。您可以阅读更多关于信号here 的信息。

但是,您询问了如果主进程已经终止,如何杀死子进程。为此,您必须使用命令行。如果您知道流氓子进程的进程 id,您可以简单地运行kill <pid>,其中 pid 是进程 id。您可以从子进程对象中获取进程 ID。如果你不知道 pid 并且无法得到它,那么你可以运行ps -eaf,它会打印出你计算机上所有当前正在运行的进程的列表,这个列表很多。因此,为了帮助找到您正在寻找的流程,您可以使用ps -eaf | grep <process-name>,这可能会帮助您找到流程。例如,如果在这种情况下ls 命令没有死,这实际上不会发生,我可以执行ps -eaf | grep ls,这很可能会找到正确的进程和进程ID。然后你可以运行kill <pid>

希望这会有所帮助。

【讨论】:

  • 感谢您的解释。我还有一个关于子进程的问题:stackoverflow.com/questions/39577012/…,你能帮帮我吗?
  • 是的,我会在第二天看看它,但没有承诺,因为我对电子不是超级熟悉。另外,如果我对this question 的回答有帮助,你会投票和/或接受吗?
  • 谢谢。我已经接受了。如果您不熟悉电子,请坚持我在那篇文章中关于子进程的最后一个问题。
猜你喜欢
  • 2021-09-05
  • 2012-01-18
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2014-09-21
相关资源
最近更新 更多