什么是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
下面是输出结果的样子。
在这个输出中,我们可以看到一些重要的细节,比如进程的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 是我们给进程的唯一名称。在我们的例子中,我们将其命名为app 。append 标志的作用与-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"]
}
]
我们在这里将两个对象,App1 和App2 ,定义为一个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 标志为真,它将使父进程中的stdout 和stderr 的输出保持沉默。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.