Windows: 自动启动 PM2 和节点应用程序

Windows: Auto start PM2 and node apps

在 Windows AWS 服务器上,我有一个 NODE 应用程序和 我正在使用 PM2 启动应用程序

我已经尝试过 NPM:"pm2-windows-startup" 和 "pm2-windows-service"

但是在我重新启动我的 AWS 实例后 运行

PM2 ls

列表中未显示任何节点应用...

我按照说明做了...

  1. 安装了 NPM(重启后 PM2 自动启动)
  2. PM2 启动 myApp.js --name mySuperApp
  3. PM2 保存
  4. 重启
  5. PM2 ls --> 没有 运行ning 节点应用程序? :-(

PM2 日志不包含任何内容...

我没有显式添加任何 ENV 变量(当我尝试 PM2 无法再启动时 - 所以我创建了一个新的 AWS windows 实例并再次从头开始安装所有东西...)

PM2 位于默认位置(我没有更改任何路径)

C:\Users\Administrator\.pm2

我的 PM2 文件包含:

2017-03-13 07:37:48: ================================== ============================================= 2017-03-13 07:37:48: --- 新的 PM2 守护进程启动了 ------------------------------------------ --------

2017-03-13 07:37:48:时间:2017 年 3 月 13 日星期一 07:37:48 GMT+0000(协调世界时) 2017-03-13 07:37:48: PM2 版本:2.4.2 2017-03-13 07:37:48:Node.js 版本:6.10.0 2017-03-13 07:37:48: 当前架构:x64 2017-03-13 07:37:48: PM2 主页:C:\Users\Administrator.pm2 2017-03-13 07:37:48: PM2 PID 文件:C:\Users\Administrator.pm2\pm2.pid 2017-03-13 07:37:48: RPC 套接字文件:\.\pipe\rpc.sock 2017-03-13 07:37:48: 总线套接字文件:\.\pipe\pub.sock 2017-03-13 07:37:48: 应用程序日志路径:C:\Users\Administrator.pm2\logs 2017-03-13 07:37:48: 进程转储文件:C:\Users\Administrator.pm2\dump.pm2 2017-03-13 07:37:48: 并发动作:2 2017-03-13 07:37:48: SIGTERM 超时:1600 2017-03-13 07:37:48: ======================================= ========================================

2017-03-13 07:37:48:在应用的 -fork 模式下启动执行序列 name:mySuperApp id:0 2017-03-13 07:37:48: 应用name:mySuperAppid:0在线 2017-03-13 07:40:45: ======================================= ========================================

2017-03-13 07:40:45: --- 新的 PM2 守护进程已启动 -------------------------- -------------------------- 2017-03-13 07:40:45: 时间:2017 年 3 月 13 日星期一 07:40:45 GMT+0000(协调世界时) 2017-03-13 07:40:45: PM2 版本:2.4.2 2017-03-13 07:40:45: Node.js 版本:6.10.0 2017-03-13 07:40:45: 当前架构:x64 2017-03-13 07:40:45: PM2 主页:C:\Users\Administrator.pm2 2017-03-13 07:40:45: PM2 PID 文件:C:\Users\Administrator.pm2\pm2.pid 2017-03-13 07:40:45:RPC 套接字文件:\.\pipe\rpc.sock 2017-03-13 07:40:45: 总线套接字文件:\.\pipe\pub.sock 2017-03-13 07:40:45:应用程序日志路径:C:\Users\Administrator.pm2\logs 2017-03-13 07:40:45: 进程转储文件:C:\Users\Administrator.pm2\dump.pm2 2017-03-13 07:40:45:并发操作:2 2017-03-13 07:40:45: SIGTERM 超时:1600 2017-03-13 07:40:45: ======================================= ========================================

我的 PM2 DUMB 文件包含:

[ { "exec_mode": "fork_mode", "watch":错误, "treekill": 是的, "autorestart":是的, "automation":是的, "pmx":是的, "vizion": 是的, "name": "mySuperApp", "node_args": [], "pm_exec_path": "c:\mypath\mySuperApp\server.js", "env":{ "windir": "C:\Windows", "USERPROFILE": "C:\Users\Administrator", "USERNAME": "Administrator", "USERDOMAIN_ROAMINGPROFILE": "EC2AMAZ-REBQJDK", "USERDOMAIN": "EC2AMAZ-REBQJDK", "TMP": "C:\Users\ADMINI~1\AppData\Local\Temp", "TEMP": "C:\Users\ADMINI~1\AppData\Local\Temp", "SystemRoot": "C:\Windows", "SystemDrive": "C:", "SESSIONNAME": "RDP-Tcp#1", "PUBLIC": "C:\Users\Public", "PSModulePath": "C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\AWS Tools\PowerShell\", "PROMPT": "$P$G", "ProgramW6432": "C:\Program Files", "ProgramFiles(x86)": "C:\Program Files (x86)", "ProgramFiles": "C:\Program Files", "ProgramData": "C:\ProgramData", "PROCESSOR_REVISION": "3f02", "PROCESSOR_LEVEL": "6", "PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 63 Stepping 2, GenuineIntel", "PROCESSOR_ARCHITECTURE": "AMD64", "PM2_USAGE": "CLI", "PM2_INTERACTOR_PROCESSING": "true", "PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC", "Path": "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Amazon\cfn-bootstrap\;C:\Program Files\nodejs\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Users\Administrator\AppData\Roaming\npm", "OS": "Windows_NT", "NUMBER_OF_PROCESSORS": "1", "LOGONSERVER": "\\EC2AMAZ-REBQJDK", "LOCALAPPDATA": "C:\Users\Administrator\AppData\Local", "HOMEPATH": "\Users\Administrator", "HOMEDRIVE": "C:", "ComSpec": "C:\Windows\system32\cmd.exe", "COMPUTERNAME": "EC2AMAZ-REBQJDK", "CommonProgramW6432": "C:\Program Files\Common Files", "CommonProgramFiles(x86)": "C:\Program Files (x86)\Common Files", "CommonProgramFiles": "C:\Program Files\Common Files", "CLIENTNAME": "THESILVERFOX", "APPDATA": "C:\Users\Administrator\AppData\Roaming", "ALLUSERSPROFILE": "C:\ProgramData", "PM2_HOME": "C:\Users\Administrator\.pm2", "mySuperApp":{} }, "pm_cwd": "c:\mypath\mySuperApp", "exec_interpreter": "node", "pm_out_log_path": "C:\Users\Administrator\.pm2\logs\mySuperApp-out-0.log", "pm_err_log_path": "C:\Users\Administrator\.pm2\logs\mySuperApp-error-0.log", "pm_pid_path": "C:\Users\Administrator\.pm2\pids\mySuperApp-0.pid", "km_link":错误, "NODE_APP_INSTANCE": 0, "vizion_running":错误, "windir": "C:\Windows", "USERPROFILE": "C:\Users\Administrator", "USERNAME": "Administrator", "USERDOMAIN_ROAMINGPROFILE": "EC2AMAZ-REBQJDK", "USERDOMAIN": "EC2AMAZ-REBQJDK", "TMP": "C:\Users\ADMINI~1\AppData\Local\Temp", "TEMP": "C:\Users\ADMINI~1\AppData\Local\Temp", "SystemRoot": "C:\Windows", "SystemDrive": "C:", "SESSIONNAME": "RDP-Tcp#1", "PUBLIC": "C:\Users\Public", "PSModulePath": "C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\AWS Tools\PowerShell\", "PROMPT": "$P$G", "ProgramW6432": "C:\Program Files", "ProgramFiles(x86)": "C:\Program Files (x86)", "ProgramFiles": "C:\Program Files", "ProgramData": "C:\ProgramData", "PROCESSOR_REVISION": "3f02", "PROCESSOR_LEVEL": "6", "PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 63 Stepping 2, GenuineIntel", "PROCESSOR_ARCHITECTURE": "AMD64", "PM2_USAGE": "CLI", "PM2_INTERACTOR_PROCESSING": "true", "PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC", "Path": "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Amazon\cfn-bootstrap\;C:\Program Files\nodejs\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Users\Administrator\AppData\Roaming\npm", "OS": "Windows_NT", "NUMBER_OF_PROCESSORS": "1", "LOGONSERVER": "\\EC2AMAZ-REBQJDK", "LOCALAPPDATA": "C:\Users\Administrator\AppData\Local", "HOMEPATH": "\Users\Administrator", "HOMEDRIVE": "C:", "ComSpec": "C:\Windows\system32\cmd.exe", "COMPUTERNAME": "EC2AMAZ-REBQJDK", "CommonProgramW6432": "C:\Program Files\Common Files", "CommonProgramFiles(x86)": "C:\Program Files (x86)\Common Files", "CommonProgramFiles": "C:\Program Files\Common Files", "CLIENTNAME": "THESILVERFOX", "APPDATA": "C:\Users\Administrator\AppData\Roaming", "ALLUSERSPROFILE": "C:\ProgramData", "PM2_HOME": "C:\Users\Administrator\.pm2", "status": "online", "pm_uptime": 1489390668484, "axm_actions": [], "axm_monitor":{ "Loop delay":{ "alert":{}, "agg_type": "avg", "value":“36.91 毫秒” } }, "axm_options":{ "default_actions":是的, "transactions":错误, "http":错误, "http_latency": 200, "http_code": 500, "ignore_routes": [], "profiling": 是的, "errors": 是的, "alert_enabled": 是的, "custom_probes": 是的, "network":假的, "ports":错误, "ignoreFilter":{ "method": [ "OPTIONS" ], "url": [] }, "excludedHooks": [], "module_conf":{}, "module_name": "mySuperApp", "module_version": "2.4.2", "pmx_version": "1.0.3", "error":真 }, "axm_dynamic":{}, "created_at": 1489390668484, "restart_time": 0, "unstable_restarts": 0, "versioning":空, "node_version": "6.10.0" } ]

2020 年 2 月 16 日更新:

如果 PM2 在您不登录机器(重新启动后)的情况下自动启动对您很重要,请按照我的新指令集而不是旧指令集进行操作。

新指令(推荐):

先决条件(第 1 部分):

首先,我已将 NPM 安装在所有用户都可以使用的位置。根据您的用例,可能没有必要。但是,如果您想更改 NPM 的默认位置 - 您应该先做(在继续之前)。以下是将其更改为位置的方法(在终端中以管理员身份):C:\NodeJS\npm:

npm config set prefix "C:\NodeJS\npm"
npm config set cache "C:\NodeJS\npm-cache"
npm config set temp "C:\NodeJS\temp"
npm config ls -l (this will list all NPM settings -> look for the 3 lines/changes marked as `overriden`)

先决条件(第 2 部分):

  1. System environments(不是用户环境)中添加并设置 PM2_HOME。喜欢:PM2_HOME = C:\NodeJS\npm
  2. C:\NodeJS\npm 添加到现有的系统 PATH 变量(然后你确定它会起作用 - 有一些问题报告说 PM2_HOME 并不总是起作用)。
  3. 关闭所有终端并再次打开它们(以管理员身份)。您的终端 windows 现在会知道您的环境变化。

先决条件(第 3 部分):

  1. npm 安装 pm2 -g
  2. npm i pm2-windows-服务-g
  3. npm install -g npm-check-updates

目前包 pm2-windows-service 使用的模块中存在一个错误 - 所以让我们也解决这个问题,请按照以下步骤操作:

  1. 在终端cd进入:C:\NodeJS\npm\node_modules\pm2-windows-service
  2. ncu inquirer 这仅输出我们需要更新的 inquirer 模块的现有版本和最新可用版本,当前:版本:1.1.2 --> 7.0.4 .
  3. ncu inquirer -u 这将更新您的 packages.json 文件。
  4. npm install 这将下载并更新 inquirer 模块(如果您未在 packages.json 文件中使用特定版本语法或您已手动更改,请注意 - -> 其他模块也会更新。

安装并设置 PM2(作为服务)在重启后自动启动:

  1. 在终端cd进入:C:\NodeJS\npm\node_modules\pm2-windows-service
  2. pm2-service-install -n PM2_STARTUP_SCRIPTPM2_STARTUP_SCRIPT 将是 Windows 服务的 "Display name"。将其更改为您喜欢的并点击 ENTER。)
  3. 执行环境设置(推荐)? Yes
  4. 设置PM2_HOME? No(不需要 - 你已经设置好了)
  5. 设置PM2_SERVICE_SCRIPTS(pm2的启动脚本列表)? Yes
  6. 设置启动列表scripts/files(分号分隔json config 文件或 js 文件)ENTER(当什么都不输入时 - 它将默认使用 PM2 的 dump.pm2 文件 - 这是你 运行 PM2 -f save 时创建的,我会 return 稍后解释)。
  7. 设置PM2_SERVICE_PM2_DIR(与服务一起使用的全局pm2的位置)? Yes

  8. 指定包含要使用的pm2版本的目录 服务? ENTER

PM2 服务已安装并启动。

  1. 在 Windows 中打开服务并将服务更改为 运行 管理员(或您喜欢的角色)。

设置您希望 PM2 启动的应用程序 - 关机或重启后:

  1. pm2 start myApp.js --name mySuperApp
  2. pm2 -f save
  3. 重新启动或者如果您使用 AWS(或任何其他云提供商)。重新启动您的实例 - 等待 5 分钟,然后登录机器并执行 pm2 ls 并检查您的应用程序是否已启动并 运行ning 约 5 分钟(不仅是几秒钟,因为您刚刚登录) .

从您的注册表中卸载并清理 "pm2-windows-startup"(如果您从我的 "old instruction" 切换到新的):

  1. npm uninstall pm2-windows-startup -g
  2. 从注册表中删除 PM2 项,如下图所示:

旧说明(不推荐):

我下面的旧答案仍然有效 - 但除非您登录机器​​,否则 PM2 不会启动,因为它从注册表加载 PM2 而不是 运行 它作为服务.

我不知道为什么 - 但经过几次尝试后成功了(在全新安装的 AWS Windows 2016 BASE 实例中)

  1. npm 安装 pm2 -g
  2. npm install pm2-windows-startup -g
  3. pm2-启动安装
  4. pm2 启动 myApp.js --name mySuperApp
  5. pm2 保存
  6. 重启
  7. pm2 ls

更新 06/2021

我发现本教程非常有用: https://blog.cloudboost.io/nodejs-pm2-startup-on-windows-db0906328d75

使用 'nssm' 和 .bat 文件的第一种方法对我不起作用, 所以我遵循了方法 2:“解决方案 2:使用 pm2-windows-service”

但是,正如其他答案中提到的,pm2-windows-service 有一个错误, 这个叉子解决了https://www.npmjs.com/package/@innomizetech/pm2-windows-service

so 而不是旧包 (pm2-windows-service): 使用新的:

npm install -g @innomizetech/pm2-windows-service

这里是教程的简短摘要:

配置 pm2

  1. npm i -g pm2
  2. 键入 pm2 以初始化并创建 .pm2 文件夹
  3. 将其从 C:\Users\USER\.pm2 复制到 C:\etc\.pm2
  4. 设置一个新的系统变量(非用户级别)名称:PM2_HOME 值:c:\etc\.pm2

运行使用 pm2 连接您的应用程序

  1. 运行 你的 pm2 应用程序。即:pm2 start app.js --name=MY_API .
  2. pm2 save 创建当前应用程序的转储 运行ning。

测试应用程序

  1. 要测试一切是否正常,请尝试:pm2 kill,然后是 pm2 resurrect(应用程序应该是 运行ning,检查 pm2 status

运行 启动时

现在我们需要在启动时执行复活命令,所以:

  1. npm install -g @innomizetech/pm2-windows-service
  2. pm2-service-install -n PM2 --unattended

就是这样。

pm2-windows-startup 如果您同意它在登录时启动这一事实,那么效果很好。如果您在服务器上重新启动(比如 Windows 更新),那您就不走运了。

pm2-windows-service 确实对我有用,使用 @innomizetech 分支,但我遇到了一些问题,可能是由于用户或其设置或其他原因。基本上该服务会启动旧版本的已保存进程列表,即使我尝试了 pm2 delete allpm2 start ecosystem.config.jspm2 save.

我采用了一个非常简单的自制解决方案:

  1. C:\ 中创建文件 pm2-resurrect.sh,其中包含单行 pm2 resurrect.
  2. 在 Task Scheduler 中,添加一个 运行 启动时的新任务,以及 select 无论用户是否登录都 运行 的任务。此时您需要输入用户密码,该密码将保存连续 运行 秒。
  3. 设置任务命令执行文件C:\pm2-resurrect.sh.

在我的例子中,我有 Git for Windows,它带有 bash,它打开文件并执行它。我没有测试它,但我想你可以有一个内容相同的 .cmd 文件。

我尝试了以上所有方法,但都没有成功。 什么对我有用:

  1. 使用 pm2 resurrect 命令创建一个 bat 文件
  2. 创建该文件的快捷方式
  3. 将该快捷方式粘贴到启动文件夹(win+R,shell:startup)

最简单的方法,效果很好,希望对某些人有所帮助

  • 我在同一文件夹中创建了一个批处理文件 *.bat
  • %windir%\system32\CMD.exe /k "start pm2 start myApp.js --name mySuperApp"
  • 已创建windows“任务计划程序”在启动时效果很好...