用永远的方式连续运行Node.js脚本

2,293 阅读6分钟

什么是Forever?

Forever是一个npm模块,确保Node.js脚本在服务器的后台持续运行。它是生产环境中的一个有用的CLI工具,因为它有助于管理Node应用程序及其进程。

在这篇文章中,我们将学习如何用我们的Node应用程序设置forever,以及学习一些重要的forever命令。

安装forever

forever可以通过两种方式使用:使用forever CLI工具和forever-monitor。forever-monitor工具可用于使用代码运行forever的应用程序。我们将在本文后面看到forever-monitor的操作。

要使用forever ,我们需要全局安装它。

npm i -g forever

用forever运行一个脚本

用forever运行一个脚本很简单。首先,使用下面的命令。

forever start app.js

注意,app.js 是脚本的名称。我们还可以用上述命令添加一个-a 标志。这个标志将确保日志文件被附加到位于forever的默认日志文件位置的默认日志文件中。还有很多其他的标志可以附加到forever 命令中。

我们还可以通过用空格分隔脚本名称来同时运行多个脚本。下面是一个例子。

forever start app.js index.js

当你使用上述命令启动进程时,你会收到一些警告和关于它正在处理的文件的信息。

在你启动脚本之后,你可以用list 命令列出所有正在运行的进程,像这样。

forever list

下面是输出结果的样子。

Forever List Output

在这个输出中,我们可以看到一些重要的细节,比如进程的id ,脚本的名称和位置,日志文件的位置,运行时间的长短,等等。

用永远的命令启动和停止脚本

当我们在生产服务器中工作时,我们的首要任务是不间断地运行脚本,即使发生一些错误。forever为我们做到了这一点。即使发生一些错误,forever也会为我们重新启动脚本。但是也有一些情况,当我们需要停止一个脚本时,也许我们需要推送一个新的变化,或者这个脚本没有用处,在这种情况下,要启动或停止这个过程,索引ID真的很方便。

在上图中,你可以看到uid 前面的[0] 。这是该脚本的索引号,可以用来杀死或停止一个进程。

要从CLI中停止一个正在运行的脚本,可以使用stop ,后面是任何一个索引id ,脚本名称,uid ,或者进程ID (pid)。

forever stop 0
// or
forever stop index.js
// or
forever stop ehbz
// or
forever stop 8196

在启动一个进程时,也可以指定一个唯一的名字。使用标签--uid newapp 将会把进程命名为newapp

forever start --uid newapp index.js

我们还可以像这样停止进程。

forever stop newapp

如果有多个进程在运行,而你想一次性停止所有的进程,你也可以使用命令stopall ,像这样。

forever stopall

用forever重启一个进程与停止该进程类似。我们用restart 替换关键字stop

forever restart 0

我们可以使用任何索引id 、脚本名称、uid 、或pid 来重启一个进程。要一次性重启所有进程,我们使用restartall

forever restartall

用forever配置和执行一个JSON文件

到目前为止,我们已经使用CLI命令来运行和管理Node脚本。但是通过forever,我们也可以配置一个JSON文件,在这里我们可以定义所有必要的细节,并执行JSON文件。让我们看一个例子。

{
  "uid": "app",
  "append": true,
  "watch": true,
  "script": "./index.js",
  "logFile": "./logs/forever.log",
  "outFile": "./logs/out.log",
  "errFile": "./logs/error.log"
}

这里,uid 是我们给进程的唯一名称。在我们的例子中,我们将其命名为appappend 标志的作用与-a 标志相同;它附加了日志。watch 标志观察文件的变化。

Script 是我们正在运行的脚本,而logFile,outFile, 和errFile 是日志文件、输出文件和错误日志文件的位置。

多个进程也可以被设置成一个JSON文件。

[
  {
    // App1
    "uid": "app1",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/home/nemo/app1"
  },
  {
    // App2
    "uid": "app2",
    "append": true,
    "script": "index.js",
    "sourceDir": "/home/nemo/app2",
    "args": ["--port", "4000"]
  }
]

我们在这里将两个对象,App1App2 ,定义为一个JSON文件中的一个数组。运行这个单一的JSON文件将运行多个进程。

现在,让我们来谈谈forever-monitor模块。

在没有CLI的情况下使用forever

forever-monitor模块有助于在不使用CLI的情况下以编程方式运行进程。让我们假设我们有一个基本的Express服务器,我们想用forever-monitor来运行。这里是服务器的代码。

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

我们有一个索引路由,当我们点击它时将显示Hello World 。现在,为了使用 forever-monitor 包,我们首先要安装与npm i forever-monitor 的依赖关系。

我们还得创建一个单独的文件,并在其中定义选项。在这个例子中,我将这个文件命名为fm.js 。在其中,我们必须首先导入forever-monitor模块。导入模块后,我们将设置选项来运行我们的应用程序。对于本教程,我们将保持非常简单。以下是代码。

const forever = require('forever-monitor');

const child = new forever.Monitor('index.js', {
  max: 3,
  silent: false,
  uid: 'index',
});

child.on('exit', function () {
  console.log('app.js has exited after 3 restarts');
});

child.start(); 

child 变量持有从forever.Monitor 方法中创建的构造器。这个构造函数接收两个参数,我们想要运行的文件名,以及一个带有选项的对象。我在这里提供了三个选项。

max: 3 键值对代表最大重试次数。如果silent 标志为真,它将使父进程中的stdoutstderr 的输出保持沉默。uid 标志为进程设置一个名称。

child.on 方法中,我们正在监听一个叫做exit 的事件。当该事件被触发时,我们在控制台记录一条信息。基本上,当达到最大重试次数时,进程就会退出。

最后,我们用child.start() 来启动这个进程。现在,用node fm.js ,在终端运行脚本就可以启动我们的进程。

这就是我们如何使用forever ,而不使用CLI来运行脚本。

总结

Forever是一个简单而有用的工具,它使开发者能够连续运行Node脚本。但也值得注意的是,由于它的简单性,它缺乏一些功能,所以请尝试一下,并决定Forever或其他工具如PM2是否最适合你的使用情况。快乐的黑客行为。

The postRunning Node.js scripts continuously using foreverappeared first onLogRocket Blog.