我们最终放弃了使用 Forever,我无法让它与 Nodemon 一起正常工作并同时观看远程目录。我们认为能够在命令上推送代码更改比在服务器崩溃时重新启动服务器更重要(这根本不会经常发生)。当我们进行代码推送时,无论如何服务器都会重新启动。
我创建了一个名为 serverMon.js 的服务器监控文件,其中包含(请参阅下面的引文以获取我修改为自己使用的代码的链接):
const fs = require('fs');
const child_process = require('child_process');
//production path
var widgetPath = '\\\\server\\share\\sbSerialWidget\\';
var widgetFiles = ['sbNodeLog.js', 'server.js'];
var passedInFileName, infile, outfile;
for(var i = 0; i < widgetFiles.length; i++){
fs.createReadStream(widgetPath + widgetFiles[i]).pipe(fs.createWriteStream(widgetFiles[i]));
}
//spawn server.js passing it's stdio, stderr, stdout back through this node instance
server = child_process.spawn('node', ['server.js'], {stdio: 'inherit'}, function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: ' + error.code);
console.log('Server.js error received: ' + error.signal);
}
console.log('Server.js STDOUT: ' + stdout);
console.log('Server.js STDERR: ' + stderr);
});
server.on('exit', function (code) {
server.kill('SIGTERM');
console.log('Child process exited with exit code '+code);
});
这由包含在 .VBS 文件中的 nodemon 脚本监视:
CreateObject("Wscript.Shell").Run "nodemon serverMon.js --exitcrash --watch \\server\share\sbSerialWidget", 0, True
这又由位于%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup 中的 CMD 脚本运行,因此它会在启动时启动 .VBS 脚本,因此我们的小串行小部件始终在后台运行:
REM @echo off
REM cls
GOTO START
:START
IF EXIST "%ProgramFiles%\sbserialwidget\server.js" GOTO WIN32
IF EXIST "%ProgramFiles(x86)%\sbSerialWidget\server.js" GOTO WIN64
ECHO End start
GOTO END
:WIN32
cls
echo Inside 32 bit
PUSHD "%ProgramFiles%"\sbserialwidget
GOTO RUNVBS
GOTO END
:WIN64
echo Inside 64 bit
PUSHD "%ProgramFiles(x86)%"\sbSerialWidget
GOTO RUNVBS
GOTO END
:RUNVBS
echo Inside RUNVBS
start runNodemon.vbs
GOTO END
:END
popd
EXIT
我们最终在 Taskmanager 中运行了三个 node.exe 实例,一个运行 nodemon,它正在监视第二个 serverMon.js,同时监视远程文件的更改,然后第三个 server.js 启动为serverMon.js 的子进程。
引用:
Copying node files with streams and pipes
Spawning a node child server