当前位置: 首页 > 面试题库 >

NodeJ在后台执行命令并忘记

段坚
2023-03-14
问题内容

我有一个无限的NodeJS script.js循环,我需要这个脚本来在后台执行另一个脚本作为服务,而这实际上是一个WebSocket服务。

var exec = require('child_process').exec;
exec('node bgService.js &');

因此,现在两个脚本都可以正常运行!

当我在Ctrl+C上执行时script.js,该bgService.js脚本也会从我不想删除的内存中删除。

如何在后台运行某些东西而忘记?


问题答案:

您可以使用child_process.spawn和以下detached选项来实现:

var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
    detached: true
});

它将使子流程成为新流程组的领导者,因此它将在父流程退出后继续运行。

但是默认情况下,父进程将等待分离的子进程退出,并且还将监听其子进程stdio。要将子进程与父进程完全分离,您应该:

  • 将子stdio进程与父进程分离,将其通过管道传输到某个文件或/dev/null
  • 使用unref()方法从父事件循环引用计数中删除子进程

这是一个示例:

var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
    stdio: 'ignore', // piping all stdio to /dev/null
    detached: true
}).unref();

如果您不想丢失孩子的stdin输出,则可以通过管道将其输出到某些日志文件中:

var fs = require('fs'),
    spawn = require('child_process').spawn,
    out = fs.openSync('./out.log', 'a'),
    err = fs.openSync('./out.log', 'a');

spawn('node', ['bgService.js'], {
    stdio: [ 'ignore', out, err ], // piping stdout and stderr to out.log
    detached: true
}).unref();

有关更多信息,请参见child_process.spawn文档



 类似资料:
  • 前面所讲,都是将工作丢到后台去运行,那么,有没有可以将后台工作拿到前台来执行的办法呢?答案是肯定的,使用  fg 命令即可。 fg 命令用于把后台工作恢复到前台执行,该命令的基本格式如下: [root@localhost ~]#fg %工作号 注意,在使用此命令时,% 可以省略,但若将 全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。 例如: [roo

  • 问题内容: 我正在使用Dockerfile创建Docker映像。我想在启动Docker容器时执行一些脚本。目前,我有一个Shell脚本来执行所有必要的过程 CMD [“ sh”,“ start.sh”] 我想用在后台示例中运行的进程执行shell命令 CMD [“ sh”,“-c”,“ mongod –dbpath / test&”] 问题答案: 除了对您的问题的评论已经指出有关Docker最佳实

  • 我正在使用DockerFile创建一个docker图像。我想在启动docker容器的同时执行一些脚本。目前我有一个shell脚本来执行所有必要的进程 CMD[“sh”,“start.sh”]

  • 本文向大家介绍在Linux中后台运行命令,包括了在Linux中后台运行命令的使用技巧和注意事项,需要的朋友参考一下 要了解何时使用Linux,一种有用的技术是在后台运行命令。有时某些命令可能要花一些时间(例如复制大文件),或者在运行时仅接管终端窗口。例如,假设您在gedit中打开文件,则可以使用以下命令。 gedit file.txt 这样做将在gedit中打开文件,但在关闭gedit之前不允许您

  • 本文向大家介绍把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?相关面试题,主要包含被问及把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?时的应答技巧和注意事项,需要的朋友参考一下 答案: 把后台任务调到前台执行 fg 把停下的后台任务在后台执行起来 bg

  • 我有一个CircleCI配置,它的末尾有一个部署脚本。该命令应该SSH到服务器中,移动到目录并执行NPM脚本。看起来是这样的: 这将引发以下错误: 这表示服务器上没有安装NPM,但它安装了。为了测试这一点,如果我单独运行这些命令,它们就可以工作。 那么这里有什么问题?