由于这篇文章在过去几年里受到了很多关注,所以我在文章的底部列出了每个平台的最佳解决方案。


原来的帖子:

我希望我的node.js服务器在后台运行,即:当我关闭我的终端时,我希望我的服务器继续运行。我在谷歌上搜索过这个,并提出了这个教程,但它并不像预期的那样工作。因此,我没有使用这个守护进程脚本,我认为我只是使用了输出重定向(2>&1 >>文件部分),但这也不退出-我在终端中得到一个空行,就像它在等待输出/错误一样。

我也尝试过把进程放在后台,但是只要我关闭终端,进程就会被杀死。

那么,当我关闭本地计算机时,如何让它继续运行呢?


高级解决方案:

Systemd (Linux) Launchd (Mac) node-windows (Windows) PM2 (node . js)


当前回答

看看赋格!除了启动许多工作者之外,您还可以妖魔化您的节点进程!

http://github.com/pgte/fugue

其他回答

公认的答案可能是最好的生产答案,但作为一个快速开发工作的hack,我发现了这个:

Nodejs的scriptname.js &没有工作,因为Nodejs似乎吞噬了&,所以在没有scriptname.js死亡的情况下,它不让我继续使用终端。

但是我把nodejs的scriptname.js放在。sh文件中,然后 Nohup sh startscriptname.sh &工作。

绝对不是一个生产的东西,但它解决了“我需要继续使用我的终端,不想启动5个不同的终端”的问题。

由于我在提供的答案列表中缺少这个选项,我想在2020年添加一个合格的选项:docker或任何等效的容器平台。除了确保您的应用程序在稳定的环境中工作外,还有额外的安全性好处以及改进的可移植性。

docker支持Windows, macOS和大多数/主要的Linux发行版。在一个受支持的平台上安装docker相当简单,并且有良好的文档。设置Node.js应用程序非常简单,只需将其放入容器中并运行该容器,同时确保在关闭后重新启动。

创建容器镜像

假设你的应用程序在服务器上的/home/me/my-app中可用,在/home/me文件夹中创建一个文本文件Dockerfile,内容类似于下面这个:

FROM node:lts-alpine
COPY /my-app/ /app/
RUN cd /app && npm ci
CMD ["/app/server.js"]

它为在Alpine Linux下运行LTS版本的Node.js创建了一个映像,将应用程序的文件复制到映像中,并运行npm ci以确保依赖项与运行时上下文匹配。

在相同的文件夹中创建另一个文件。dockerignore

**/node_modules

这将防止宿主系统的现有依赖项被注入到容器中,因为它们可能在那里不起作用。Dockerfile中的RUN命令将修复这个问题。

使用如下命令创建图像:

docker build -t myapp-as-a-service /home/me

-t选项选择构建的容器映像的“名称”。这将用于下面运行的容器。

注意:最后一个参数是选择包含Dockerfile的文件夹,而不是Dockerfile本身。你可以使用选项-f选择一个不同的选项。

启动容器

使用此命令启动容器:

docker run -d --restart always -p 80:3000 myapp-as-a-service

这个命令假设你的应用程序正在监听端口3000,而你想让它暴露在主机的端口80上。

当然,这是一个非常有限的例子,但它是一个很好的起点。

这可能不是被接受的方式,但我在屏幕上这样做,特别是在开发过程中,因为我可以在必要时恢复它并愚弄它。

screen
node myserver.js
>>CTRL-A then hit D

屏幕将分离,并幸存你注销。然后你可以用screen -r把它找回来。点击屏幕手册了解更多细节。你可以给屏幕命名等等。

我使用Supervisor进行开发。它就是有用。当你对.js文件进行更改时,管理器会自动重新启动你的应用程序,加载这些更改。

这是其Github页面的链接

安装:

Sudo NPM安装管理器

使用-e可以很容易地让它监视其他扩展名。我经常使用的另一个命令是-i来忽略某些文件夹。

您可以使用nohup和supervisor使您的节点应用程序即使在注销后也能在后台运行。

Sudo nohup supervisor myapp.js &

我只是使用daemon npm模块:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

最近,我还使用TJ Holowaychuk的mon(1)来启动和管理简单的节点应用程序。