原创

在windows上安装pm2并设置开机启动

pm2是一个node.js的进程管理工具,pm2还能够提供性能监控、进程保活功能。node和相关工具在Linux系统上使用非常简单而且一般也不会出什么问题,然而在Windows上设置起来就没那么简单了,还可能会遇到各种各样的问题。本文将介绍pm2的安装和启动过程并解决一些常见问题。

各软件版本
软件 | 版本
--- | ---
Windows | 2019
node | v12.18.3
npm | 6.14.6
pm2 | 4.4.1

在Windows上安装node还是比较简单的,下载安装包一路点击下一步就可以了。安装完成之后系统已经包含了node和npm,国内使用npm如果网络不是很好的话要设置一下国内的镜像源。npm国内源还是挺多的腾讯、清华大学等都提供了npm的镜像源。

验证npm没问题之后就可以安装pm2,这里应该不会出现什么问题。

npm install pm2 -g

下一步启动项目。这里可能会遇到第一个问题:项目启动报错。

pm2 start npm -- start

(function (exports, require, module, __filename, __dirname) { :: Created by npm, please don't edit manually.
                                                              ^
SyntaxError: Unexpected token :
    at Object.exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:543:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Object.<anonymous> (C:\Users\nitin.mukesh\AppData\Roaming\npm\node_modules\pm2\lib\ProcessContainerFork.js:53:21)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)

这个问题似乎是因为没有执行cmd的权限我没有深入研究。有两个解决方案。第一个安装node-cmd包,使用这个包的api编写一个启动脚本,这个脚本调用npm start。项目启动之后会在桌面留下一个控制台窗口,这个窗口不能关。

npm install node-cmd --save;

startscript.js

var cmd=require('node-cmd'); cmd.run('npm start');

启动

pm2 start startscript.js

第二个解决方案原理也差不多,不用安装第三方包,还可以把控制台窗口隐藏起来。编辑startscript.js

var exec = require('child_process').exec;
exec('npm start', {windowsHide: true});

再次启动就不会出现控制台窗口了。

下面设置开机启动,可能会遇到第二个问题

pm2 save
pm2 startup

[PM2][ERROR] Init system not found
C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\lib\API\Startup.js:209
      throw new Error('Init system not found');
      ^

Error: Init system not found
    at API.CLI.startup (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\lib\API\Startup.js:209:13)
    at Command.<anonymous> (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\lib\binaries\CLI.js:707:9)
    at Command.listener (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\node_modules\commander\index.js:315:8)
    at Command.emit (events.js:315:20)
    at Command.parseArgs (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\node_modules\commander\index.js:651:12)
    at Command.parse (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\node_modules\commander\index.js:474:21)
    at Timeout._onTimeout (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\lib\binaries\CLI.js:204:15)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7)

查看pm2的官方文档,提示我们要安装pm2-windows-service包。参照提示安装的时候还是会遇到问题。

npm i pm2-windows-service -g
pm2-service-install

这里提示Perform environment setup...选择y或者n都会卡住,原因似乎是依赖项版本太低造成的。在pm2-windows-service作者更新项目之前我们要自己解决这个问题。

npm install -g npm-check-updates

cd %USERPROFILE%\AppData\Roaming\npm\node_modules\pm2-windows-service
ncu inquirer -u
npm install

再次执行安装服务的命令,可以在服务中看到安装成功的PM2服务。

pm2-service-install

这里一定要设置系统级别的PM2_HOME环境变量,不然会出现一些意想不到的问题。这一点pm2-windows-service项目的文档也给出了警告,一定要严格执行。

这些问题解决完之后就可以启动你的项目了。pm2 list查看你的项目正在运行,pm2 save记录一下pm2的状态,这是为了在服务器重启之后pm2能自动启动你的项目。重启一下试试吧。

可以看到在windows上使用pm2还是挺麻烦的,要解决各种问题。pm2-windows-service这么重要的项目竟然已经3年没有更新了,如果有条件的话服务器环境还是选择Linux吧。

正文到此结束
该篇文章的评论功能已被站长关闭