Windows: Auto start PM2 and node apps

可紊 提交于 2021-02-05 13:03:39

问题


At a Windows AWS server i have a NODE app and i'm using PM2 to launch the app

I have tried the NPMs: "pm2-windows-startup" and "pm2-windows-service"

But after i restart my AWS instance and run

PM2 ls

No node app shows up in the list...

I followed the instructions ...

  1. Installed the NPM (So PM2 auto start after reboot)
  2. PM2 start myApp.js --name mySuperApp
  3. PM2 save
  4. Reboot
  5. PM2 ls --> no running node apps? :-(

The PM2 logs dont contain any thing...

I have not added any ENV variables explicit (when i tried PM2 could not start any more - so i created a fresh AWS windows instance and installed every thing from scratch again...)

PM2 is located the default place (i have not changed any paths)

C:\Users\Administrator\.pm2

My PM2 file contains:

2017-03-13 07:37:48: =============================================================================== 2017-03-13 07:37:48: --- New PM2 Daemon started ----------------------------------------------------

2017-03-13 07:37:48: Time : Mon Mar 13 2017 07:37:48 GMT+0000 (Coordinated Universal Time) 2017-03-13 07:37:48: PM2 version : 2.4.2 2017-03-13 07:37:48: Node.js version : 6.10.0 2017-03-13 07:37:48: Current arch : x64 2017-03-13 07:37:48: PM2 home : C:\Users\Administrator.pm2 2017-03-13 07:37:48: PM2 PID file : C:\Users\Administrator.pm2\pm2.pid 2017-03-13 07:37:48: RPC socket file : \.\pipe\rpc.sock 2017-03-13 07:37:48: BUS socket file : \.\pipe\pub.sock 2017-03-13 07:37:48: Application log path : C:\Users\Administrator.pm2\logs 2017-03-13 07:37:48: Process dump file : C:\Users\Administrator.pm2\dump.pm2 2017-03-13 07:37:48: Concurrent actions : 2 2017-03-13 07:37:48: SIGTERM timeout : 1600 2017-03-13 07:37:48: ===============================================================================

2017-03-13 07:37:48: Starting execution sequence in -fork mode- for app name:mySuperApp id:0 2017-03-13 07:37:48: App name:mySuperApp id:0 online 2017-03-13 07:40:45: ===============================================================================

2017-03-13 07:40:45: --- New PM2 Daemon started ---------------------------------------------------- 2017-03-13 07:40:45: Time : Mon Mar 13 2017 07:40:45 GMT+0000 (Coordinated Universal Time) 2017-03-13 07:40:45: PM2 version : 2.4.2 2017-03-13 07:40:45: Node.js version : 6.10.0 2017-03-13 07:40:45: Current arch : x64 2017-03-13 07:40:45: PM2 home : C:\Users\Administrator.pm2 2017-03-13 07:40:45: PM2 PID file : C:\Users\Administrator.pm2\pm2.pid 2017-03-13 07:40:45: RPC socket file : \.\pipe\rpc.sock 2017-03-13 07:40:45: BUS socket file : \.\pipe\pub.sock 2017-03-13 07:40:45: Application log path : C:\Users\Administrator.pm2\logs 2017-03-13 07:40:45: Process dump file : C:\Users\Administrator.pm2\dump.pm2 2017-03-13 07:40:45: Concurrent actions : 2 2017-03-13 07:40:45: SIGTERM timeout : 1600 2017-03-13 07:40:45: ===============================================================================

My PM2 DUMB file contains:

[ { "exec_mode": "fork_mode", "watch": false, "treekill": true, "autorestart": true, "automation": true, "pmx": true, "vizion": true, "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\2", "TEMP": "C:\Users\ADMINI~1\AppData\Local\Temp\2", "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": false, "NODE_APP_INSTANCE": 0, "vizion_running": false, "windir": "C:\Windows", "USERPROFILE": "C:\Users\Administrator", "USERNAME": "Administrator", "USERDOMAIN_ROAMINGPROFILE": "EC2AMAZ-REBQJDK", "USERDOMAIN": "EC2AMAZ-REBQJDK", "TMP": "C:\Users\ADMINI~1\AppData\Local\Temp\2", "TEMP": "C:\Users\ADMINI~1\AppData\Local\Temp\2", "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.91ms" } }, "axm_options": { "default_actions": true, "transactions": false, "http": false, "http_latency": 200, "http_code": 500, "ignore_routes": [], "profiling": true, "errors": true, "alert_enabled": true, "custom_probes": true, "network": false, "ports": false, "ignoreFilter": { "method": [ "OPTIONS" ], "url": [] }, "excludedHooks": [], "module_conf": {}, "module_name": "mySuperApp", "module_version": "2.4.2", "pmx_version": "1.0.3", "error": true }, "axm_dynamic": {}, "created_at": 1489390668484, "restart_time": 0, "unstable_restarts": 0, "versioning": null, "node_version": "6.10.0" } ]


回答1:


UPDATE 16 FEB 2020:

If it is important to you that PM2 automatically starts up without you logging into the machine (after reboot) please follow my new set of instructions instead of the old ones.

New instructions (recommended):

Prerequisites (part # 1):

First, I have installed NPM in a location which is available to all users. Depending on your use-case(s) it might not be necessary. But if you like to change your default location of NPM - you should do it first (before continuing). Here is how you change it to the location (in terminal as administrator): 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`)

Prerequisites (part # 2):

  1. Add and set PM2_HOME in System environments (not user environments). Like: PM2_HOME = C:\NodeJS\npm
  2. Add C:\NodeJS\npm to the existing system PATH variable (Then you are sure it will work - there has been some issues reported that PM2_HOME not always working).
  3. Close all terminals and open them again (as administrator). Your terminal windows will now be aware of your environment changes.

Prerequisites (part # 3):

  1. npm install pm2 -g
  2. npm i pm2-windows-service -g
  3. npm install -g npm-check-updates

Currently there is a bug in a module which the package pm2-windows-service uses - so lets fix this as well, please follow the steps below:

  1. In terminal cd into: C:\NodeJS\npm\node_modules\pm2-windows-service
  2. ncu inquirer this only outputs the existing and the newest available version of the inquirer module we need to update, currently: version: 1.1.2 --> 7.0.4.
  3. ncu inquirer -u this will update your packages.json file.
  4. npm install this will download and update the inquirer module (please be aware if you don't use specific version syntax in your packages.json file or you have made manually changes --> other modules would be updated as well.

Install and setup PM2 (as a service) to automatically startup after reboot:

  1. In terminal cd into: C:\NodeJS\npm\node_modules\pm2-windows-service
  2. pm2-service-install -n PM2_STARTUP_SCRIPT (PM2_STARTUP_SCRIPT will be the "Display name" of the Windows service. Change it to what you prefer and hit ENTER.)
  3. Perform environment setup (recommended)? Yes
  4. Set PM2_HOME? No (No need - You have set it already)
  5. Set PM2_SERVICE_SCRIPTS (the list of start-up scripts for pm2)? Yes
  6. Set the list of startup scripts/files (semi-colon separated json config files or js files) ENTER (when nothing is entered - it will default to use PM2's dump.pm2 file - which is created when you run PM2 -f save, I will return and explain this later on).
  7. Set PM2_SERVICE_PM2_DIR (the location of the global pm2 to use with the service)? Yes

  8. Specify the directory containing the pm2 version to be used by the service? ENTER

PM2 service installed and started.

  1. Open Services in Windows and change the service to run as Administrator (or your preferred role).

Setup the app(s) you like PM2 to startup - when shutdown or after a reboot:

  1. pm2 start myApp.js --name mySuperApp
  2. pm2 -f save
  3. reboot or if you use AWS (or any other cloud provider). Reboot your instance - wait 5 minutes and then log into the machine and execute pm2 ls and check your app has been up and running for ~ 5 min (and not only few secs because you just logged in).

Uninstall and cleanup "pm2-windows-startup" from your registry (if you switch from my "old instruction" to the new ones):

  1. npm uninstall pm2-windows-startup -g
  2. Delete the PM2 key from registry like in the picture below:

Old instructions (not recommended):

My old answer below is still working - but PM2 doesn't startup unless you log into the machine because it is loading PM2 from registry and doesn't run it as a service.

I don't know why - but after several attempts this worked out (at a fresh installed AWS Windows 2016 BASE instance)

  1. npm install pm2 -g
  2. npm install pm2-windows-startup -g
  3. pm2-startup install
  4. pm2 start myApp.js --name mySuperApp
  5. pm2 save
  6. reboot
  7. pm2 ls



回答2:


I found this tutorial very useful: https://blog.cloudboost.io/nodejs-pm2-startup-on-windows-db0906328d75

the first approach using 'nssm' and a .bat file not worked for me, so I followed approach 2: "Solution2: Using pm2-windows-service"

However, as mentioned in other answers, the pm2-windows-service has a bug, which this fork solved: https://www.npmjs.com/package/@innomizetech/pm2-windows-service

so instead of the old package:

npm install -g pm2-windows-service

use the new one:

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

here a short summary of the tutorial:

Configure pm2

  1. npm i -g pm2
  2. copy C:\Users\USER\.pm2 to C:\etc\.pm2
  3. set a new System Variable (not user level) name: PM2_HOME value: c:\etc\.pm2

Runnning your app with pm2

  1. run your pm2 app. ie: pm2 start app.js --name=MY_API .
  2. pm2 save to create a dump of the current apps running.

Testing app

  1. to test everything is working, try: pm2 kill and then pm2 resurrect (app should be running, check with pm2 status )

Run at startup

now we need to perform the resurrect command at startup, so:

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

thats it.




回答3:


pm2-windows-startup works great if you're okay with the fact that it is launched on login. If you have a reboot on a server though (say Windows Update) you are out of luck.

pm2-windows-service did work for me, using @innomizetech fork, but I've had some issues, probably due to the user or its setup, or something else. Basically the service would start an old version of the saved process list, even though I tried pm2 delete all, pm2 start ecosystem.config.js, pm2 save.

I resorted to a very simple home-made solution:

  1. Create a file pm2-resurrect.sh in C:\, which contains the single line pm2 resurrect.
  2. In Task Scheduler, add a new task that is run on boot, and select that it is run whether the user is logged in or not. You need to type the user password at this point which is saved for successive runs.
  3. Set the task command to execute the file C:\pm2-resurrect.sh.

In my case I have Git for Windows which comes with bash, which opens the file and executes it. I didn't test it but I guess you could have a .cmd file with the same content.



来源:https://stackoverflow.com/questions/42758985/windows-auto-start-pm2-and-node-apps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!