@zappinginc/zm2 6.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +8 -0
- package/.gitattributes +4 -0
- package/.mocharc.js +14 -0
- package/CHANGELOG.md +2416 -0
- package/CLAUDE.md +84 -0
- package/CONTRIBUTING.md +124 -0
- package/GNU-AGPL-3.0.txt +665 -0
- package/LICENSE +1 -0
- package/README.md +248 -0
- package/bin/zm2 +3 -0
- package/bin/zm2-dev +3 -0
- package/bin/zm2-docker +3 -0
- package/bin/zm2-runtime +3 -0
- package/bin/zm2-windows +3 -0
- package/bin/zm2.ps1 +3 -0
- package/bun.lock +421 -0
- package/constants.js +114 -0
- package/index.js +13 -0
- package/lib/API/Configuration.js +212 -0
- package/lib/API/Containerizer.js +335 -0
- package/lib/API/Dashboard.js +459 -0
- package/lib/API/Deploy.js +117 -0
- package/lib/API/Extra.js +775 -0
- package/lib/API/ExtraMgmt/Docker.js +30 -0
- package/lib/API/Log.js +315 -0
- package/lib/API/LogManagement.js +371 -0
- package/lib/API/Modules/LOCAL.js +122 -0
- package/lib/API/Modules/Modularizer.js +148 -0
- package/lib/API/Modules/NPM.js +445 -0
- package/lib/API/Modules/TAR.js +362 -0
- package/lib/API/Modules/flagExt.js +46 -0
- package/lib/API/Modules/index.js +120 -0
- package/lib/API/Monit.js +247 -0
- package/lib/API/Serve.js +343 -0
- package/lib/API/Startup.js +629 -0
- package/lib/API/UX/helpers.js +213 -0
- package/lib/API/UX/index.js +9 -0
- package/lib/API/UX/pm2-describe.js +193 -0
- package/lib/API/UX/pm2-ls-minimal.js +31 -0
- package/lib/API/UX/pm2-ls.js +483 -0
- package/lib/API/Version.js +382 -0
- package/lib/API/interpreter.json +12 -0
- package/lib/API/pm2-plus/PM2IO.js +372 -0
- package/lib/API/pm2-plus/auth-strategies/CliAuth.js +288 -0
- package/lib/API/pm2-plus/auth-strategies/WebAuth.js +187 -0
- package/lib/API/pm2-plus/helpers.js +97 -0
- package/lib/API/pm2-plus/link.js +126 -0
- package/lib/API/pm2-plus/pres/motd +16 -0
- package/lib/API/pm2-plus/pres/motd.update +26 -0
- package/lib/API/pm2-plus/pres/welcome +28 -0
- package/lib/API/pm2-plus/process-selector.js +52 -0
- package/lib/API/schema.json +379 -0
- package/lib/API.js +1931 -0
- package/lib/Client.js +776 -0
- package/lib/Common.js +911 -0
- package/lib/Configuration.js +304 -0
- package/lib/Daemon.js +456 -0
- package/lib/Event.js +37 -0
- package/lib/God/ActionMethods.js +909 -0
- package/lib/God/ClusterMode.js +97 -0
- package/lib/God/ForkMode.js +297 -0
- package/lib/God/Methods.js +265 -0
- package/lib/God/Reload.js +240 -0
- package/lib/God.js +632 -0
- package/lib/HttpInterface.js +76 -0
- package/lib/ProcessContainer.js +305 -0
- package/lib/ProcessContainerBun.js +360 -0
- package/lib/ProcessContainerFork.js +42 -0
- package/lib/ProcessContainerForkBun.js +33 -0
- package/lib/ProcessUtils.js +55 -0
- package/lib/TreeKill.js +118 -0
- package/lib/Utility.js +430 -0
- package/lib/VersionCheck.js +46 -0
- package/lib/Watcher.js +117 -0
- package/lib/Worker.js +169 -0
- package/lib/binaries/CLI.js +1041 -0
- package/lib/binaries/DevCLI.js +183 -0
- package/lib/binaries/Runtime.js +101 -0
- package/lib/binaries/Runtime4Docker.js +192 -0
- package/lib/completion.js +229 -0
- package/lib/completion.sh +40 -0
- package/lib/motd +36 -0
- package/lib/templates/Dockerfiles/Dockerfile-java.tpl +7 -0
- package/lib/templates/Dockerfiles/Dockerfile-nodejs.tpl +8 -0
- package/lib/templates/Dockerfiles/Dockerfile-ruby.tpl +7 -0
- package/lib/templates/ecosystem-es.tpl +24 -0
- package/lib/templates/ecosystem-simple-es.tpl +8 -0
- package/lib/templates/ecosystem-simple.tpl +6 -0
- package/lib/templates/ecosystem.tpl +22 -0
- package/lib/templates/init-scripts/launchd.tpl +35 -0
- package/lib/templates/init-scripts/openrc.tpl +52 -0
- package/lib/templates/init-scripts/pm2-init-amazon.sh +86 -0
- package/lib/templates/init-scripts/rcd-openbsd.tpl +41 -0
- package/lib/templates/init-scripts/rcd.tpl +44 -0
- package/lib/templates/init-scripts/smf.tpl +43 -0
- package/lib/templates/init-scripts/systemd-online.tpl +22 -0
- package/lib/templates/init-scripts/systemd.tpl +22 -0
- package/lib/templates/init-scripts/upstart.tpl +103 -0
- package/lib/templates/logrotate.d/pm2 +10 -0
- package/lib/templates/sample-apps/http-server/README.md +14 -0
- package/lib/templates/sample-apps/http-server/api.js +9 -0
- package/lib/templates/sample-apps/http-server/ecosystem.config.js +14 -0
- package/lib/templates/sample-apps/http-server/package.json +11 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/README.md +45 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/custom-metrics.js +66 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/ecosystem.config.js +12 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/package.json +11 -0
- package/lib/templates/sample-apps/python-app/README.md +4 -0
- package/lib/templates/sample-apps/python-app/echo.py +7 -0
- package/lib/templates/sample-apps/python-app/ecosystem.config.js +12 -0
- package/lib/templates/sample-apps/python-app/package.json +11 -0
- package/lib/tools/Config.js +248 -0
- package/lib/tools/IsAbsolute.js +20 -0
- package/lib/tools/copydirSync.js +101 -0
- package/lib/tools/deleteFolderRecursive.js +19 -0
- package/lib/tools/find-package-json.js +74 -0
- package/lib/tools/fmt.js +72 -0
- package/lib/tools/isbinaryfile.js +94 -0
- package/lib/tools/json5.js +752 -0
- package/lib/tools/open.js +63 -0
- package/lib/tools/passwd.js +58 -0
- package/lib/tools/promise.min.js +1 -0
- package/lib/tools/sexec.js +55 -0
- package/lib/tools/treeify.js +113 -0
- package/lib/tools/which.js +120 -0
- package/lib/tools/xdg-open +861 -0
- package/package.json +219 -0
- package/paths.js +93 -0
- package/pm2 +11 -0
- package/preinstall.js +24 -0
- package/run.sh +9 -0
- package/types/index.d.ts +722 -0
- package/types/tsconfig.json +14 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
###-begin-pm2-completion-###
|
|
2
|
+
### credits to npm for the completion file model
|
|
3
|
+
#
|
|
4
|
+
# Installation: pm2 completion >> ~/.bashrc (or ~/.zshrc)
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
COMP_WORDBREAKS=${COMP_WORDBREAKS/=/}
|
|
8
|
+
COMP_WORDBREAKS=${COMP_WORDBREAKS/@/}
|
|
9
|
+
export COMP_WORDBREAKS
|
|
10
|
+
|
|
11
|
+
if type complete &>/dev/null; then
|
|
12
|
+
_pm2_completion () {
|
|
13
|
+
local si="$IFS"
|
|
14
|
+
IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
|
|
15
|
+
COMP_LINE="$COMP_LINE" \
|
|
16
|
+
COMP_POINT="$COMP_POINT" \
|
|
17
|
+
pm2 completion -- "${COMP_WORDS[@]}" \
|
|
18
|
+
2>/dev/null)) || return $?
|
|
19
|
+
IFS="$si"
|
|
20
|
+
}
|
|
21
|
+
complete -o default -F _pm2_completion pm2
|
|
22
|
+
elif type compctl &>/dev/null; then
|
|
23
|
+
_pm2_completion () {
|
|
24
|
+
local cword line point words si
|
|
25
|
+
read -Ac words
|
|
26
|
+
read -cn cword
|
|
27
|
+
let cword-=1
|
|
28
|
+
read -l line
|
|
29
|
+
read -ln point
|
|
30
|
+
si="$IFS"
|
|
31
|
+
IFS=$'\n' reply=($(COMP_CWORD="$cword" \
|
|
32
|
+
COMP_LINE="$line" \
|
|
33
|
+
COMP_POINT="$point" \
|
|
34
|
+
pm2 completion -- "${words[@]}" \
|
|
35
|
+
2>/dev/null)) || return $?
|
|
36
|
+
IFS="$si"
|
|
37
|
+
}
|
|
38
|
+
compctl -K _pm2_completion + -f + pm2
|
|
39
|
+
fi
|
|
40
|
+
###-end-pm2-completion-###
|
package/lib/motd
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
|
|
2
|
+
-------------
|
|
3
|
+
|
|
4
|
+
__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
|
|
5
|
+
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
|
|
6
|
+
_\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
|
|
7
|
+
_\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
|
|
8
|
+
_\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
|
|
9
|
+
_\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
|
|
10
|
+
_\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
|
|
11
|
+
_\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
|
|
12
|
+
_\///______________\///______________\///__\///////////////__
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Runtime Edition
|
|
16
|
+
|
|
17
|
+
ZM2 is a Production Process Manager for Node.js applications
|
|
18
|
+
with a built-in Load Balancer.
|
|
19
|
+
|
|
20
|
+
Start and Daemonize any application:
|
|
21
|
+
$ zm2 start app.js
|
|
22
|
+
|
|
23
|
+
Load Balance 4 instances of api.js:
|
|
24
|
+
$ zm2 start api.js -i 4
|
|
25
|
+
|
|
26
|
+
Monitor in production:
|
|
27
|
+
$ zm2 monitor
|
|
28
|
+
|
|
29
|
+
Make zm2 auto-boot at server restart:
|
|
30
|
+
$ zm2 startup
|
|
31
|
+
|
|
32
|
+
To go further checkout:
|
|
33
|
+
http://pm2.io/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
-------------
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const config = {
|
|
2
|
+
apps : [{
|
|
3
|
+
script: 'index.js',
|
|
4
|
+
watch: '.'
|
|
5
|
+
}, {
|
|
6
|
+
script: './service-worker/',
|
|
7
|
+
watch: ['./service-worker']
|
|
8
|
+
}],
|
|
9
|
+
|
|
10
|
+
deploy : {
|
|
11
|
+
production : {
|
|
12
|
+
user : 'SSH_USERNAME',
|
|
13
|
+
host : 'SSH_HOSTMACHINE',
|
|
14
|
+
ref : 'origin/master',
|
|
15
|
+
repo : 'GIT_REPOSITORY',
|
|
16
|
+
path : 'DESTINATION_PATH',
|
|
17
|
+
'pre-deploy-local': '',
|
|
18
|
+
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
|
|
19
|
+
'pre-setup': ''
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default config;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
apps : [{
|
|
3
|
+
script: 'index.js',
|
|
4
|
+
watch: '.'
|
|
5
|
+
}, {
|
|
6
|
+
script: './service-worker/',
|
|
7
|
+
watch: ['./service-worker']
|
|
8
|
+
}],
|
|
9
|
+
|
|
10
|
+
deploy : {
|
|
11
|
+
production : {
|
|
12
|
+
user : 'SSH_USERNAME',
|
|
13
|
+
host : 'SSH_HOSTMACHINE',
|
|
14
|
+
ref : 'origin/master',
|
|
15
|
+
repo : 'GIT_REPOSITORY',
|
|
16
|
+
path : 'DESTINATION_PATH',
|
|
17
|
+
'pre-deploy-local': '',
|
|
18
|
+
'post-deploy' : 'npm install && zm2 reload ecosystem.config.js --env production',
|
|
19
|
+
'pre-setup': ''
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>Label</key>
|
|
6
|
+
<string>com.ZM2</string>
|
|
7
|
+
<key>UserName</key>
|
|
8
|
+
<string>%USER%</string>
|
|
9
|
+
<key>KeepAlive</key>
|
|
10
|
+
<true/>
|
|
11
|
+
<key>ProgramArguments</key>
|
|
12
|
+
<array>
|
|
13
|
+
<string>/bin/sh</string>
|
|
14
|
+
<string>-c</string>
|
|
15
|
+
<string>%PM2_PATH% resurrect</string>
|
|
16
|
+
</array>
|
|
17
|
+
<key>RunAtLoad</key>
|
|
18
|
+
<true/>
|
|
19
|
+
<key>OnDemand</key>
|
|
20
|
+
<false/>
|
|
21
|
+
<key>LaunchOnlyOnce</key>
|
|
22
|
+
<true/>
|
|
23
|
+
<key>EnvironmentVariables</key>
|
|
24
|
+
<dict>
|
|
25
|
+
<key>PATH</key>
|
|
26
|
+
<string>%NODE_PATH%</string>
|
|
27
|
+
<key>PM2_HOME</key>
|
|
28
|
+
<string>%HOME_PATH%</string>
|
|
29
|
+
</dict>
|
|
30
|
+
<key>StandardErrorPath</key>
|
|
31
|
+
<string>/tmp/com.ZM2.err</string>
|
|
32
|
+
<key>StandardOutPath</key>
|
|
33
|
+
<string>/tmp/com.ZM2.out</string>
|
|
34
|
+
</dict>
|
|
35
|
+
</plist>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/sbin/openrc-run
|
|
2
|
+
# Copyright 2013-2022 the ZM2 project authors. All rights reserved.
|
|
3
|
+
# Init script automatically generated by zm2 startup
|
|
4
|
+
|
|
5
|
+
description="Production process manager for Node.js apps with a built-in load balancer."
|
|
6
|
+
|
|
7
|
+
extra_started_commands="reload"
|
|
8
|
+
|
|
9
|
+
PM2="%PM2_PATH%"
|
|
10
|
+
user=${PM2_USER:-%USER%}
|
|
11
|
+
export PM2_HOME=$(eval echo ~${user})"/.pm2/"
|
|
12
|
+
# Options for start-stop-daemon (default start function)
|
|
13
|
+
command=${PM2}
|
|
14
|
+
command_user=${user}
|
|
15
|
+
command_args="resurrect"
|
|
16
|
+
pidfile=${PM2_HOME}/zm2.pid
|
|
17
|
+
|
|
18
|
+
run_pm2_as_user() {
|
|
19
|
+
einfo "${PM2} $@"
|
|
20
|
+
eval su -l ${user} -c \'${PM2} $@\'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
depend() {
|
|
24
|
+
need net
|
|
25
|
+
need localmount
|
|
26
|
+
after bootmisc
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
start_post() {
|
|
30
|
+
if [ "${user}" == "root" ]; then
|
|
31
|
+
ewarn "ZM2: Better run this daemon as a non root user. To set this user create"
|
|
32
|
+
ewarn "ZM2: /etc/conf.d/zm2 file and define 'PM2_USER=user' there."
|
|
33
|
+
ewarn "ZM2: Note user MUST have home directory for ZM2 logs/state/etc..."
|
|
34
|
+
fi
|
|
35
|
+
einfo "ZM2: Process Manager started. To start services run:"
|
|
36
|
+
einfo "ZM2: # su -l ${user} -c '$PM2 start /path/to/app'"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
stop() {
|
|
40
|
+
ebegin "Stopping ZM2 process manager..."
|
|
41
|
+
run_pm2_as_user dump
|
|
42
|
+
run_pm2_as_user kill
|
|
43
|
+
eend $?
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
reload() {
|
|
47
|
+
ebegin "Reloading zm2"
|
|
48
|
+
run_pm2_as_user reload all
|
|
49
|
+
eend $?
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# vim: ts=4
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# zm2 Process manager for NodeJS
|
|
4
|
+
#
|
|
5
|
+
# chkconfig: 345 80 20
|
|
6
|
+
#
|
|
7
|
+
# description: ZM2 next gen process manager for Node.js
|
|
8
|
+
# processname: zm2
|
|
9
|
+
#
|
|
10
|
+
### BEGIN INIT INFO
|
|
11
|
+
# Provides: zm2
|
|
12
|
+
# Required-Start: $local_fs $remote_fs
|
|
13
|
+
# Required-Stop: $local_fs $remote_fs
|
|
14
|
+
# Should-Start: $network
|
|
15
|
+
# Should-Stop: $network
|
|
16
|
+
# Default-Start: 2 3 4 5
|
|
17
|
+
# Default-Stop: 0 1 6
|
|
18
|
+
# Short-Description: ZM2 init script
|
|
19
|
+
# Description: ZM2 is the next gen process manager for Node.js
|
|
20
|
+
### END INIT INFO
|
|
21
|
+
|
|
22
|
+
NAME=zm2
|
|
23
|
+
PM2=%PM2_PATH%
|
|
24
|
+
USER=%USER%
|
|
25
|
+
|
|
26
|
+
export PATH=%NODE_PATH%:$PATH
|
|
27
|
+
export PM2_HOME="%HOME_PATH%"
|
|
28
|
+
|
|
29
|
+
lockfile="/var/lock/subsys/zm2-init.sh"
|
|
30
|
+
|
|
31
|
+
super() {
|
|
32
|
+
su - $USER -c "PATH=$PATH; PM2_HOME=$PM2_HOME $*"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
start() {
|
|
36
|
+
echo "Starting $NAME"
|
|
37
|
+
super $PM2 resurrect
|
|
38
|
+
retval=$?
|
|
39
|
+
[ $retval -eq 0 ] && touch $lockfile
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
stop() {
|
|
43
|
+
echo "Stopping $NAME"
|
|
44
|
+
super $PM2 kill
|
|
45
|
+
rm -f $lockfile
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
restart() {
|
|
49
|
+
echo "Restarting $NAME"
|
|
50
|
+
stop
|
|
51
|
+
start
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
reload() {
|
|
55
|
+
echo "Reloading $NAME"
|
|
56
|
+
super $PM2 reload all
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
status() {
|
|
60
|
+
echo "Status for $NAME:"
|
|
61
|
+
super $PM2 list
|
|
62
|
+
RETVAL=$?
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
case "$1" in
|
|
66
|
+
start)
|
|
67
|
+
start
|
|
68
|
+
;;
|
|
69
|
+
stop)
|
|
70
|
+
stop
|
|
71
|
+
;;
|
|
72
|
+
status)
|
|
73
|
+
status
|
|
74
|
+
;;
|
|
75
|
+
restart)
|
|
76
|
+
restart
|
|
77
|
+
;;
|
|
78
|
+
reload)
|
|
79
|
+
reload
|
|
80
|
+
;;
|
|
81
|
+
*)
|
|
82
|
+
echo "Usage: {start|stop|status|restart|reload}"
|
|
83
|
+
exit 1
|
|
84
|
+
;;
|
|
85
|
+
esac
|
|
86
|
+
exit $RETVAL
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
#
|
|
3
|
+
# from /usr/ports/infrastructure/templates/rc.template
|
|
4
|
+
|
|
5
|
+
daemon="/usr/local/bin/zm2"
|
|
6
|
+
#daemon_flags=
|
|
7
|
+
#daemon_rtable=0
|
|
8
|
+
#daemon_timeout="30"
|
|
9
|
+
daemon_user="%USER%"
|
|
10
|
+
|
|
11
|
+
. /etc/rc.d/rc.subr
|
|
12
|
+
|
|
13
|
+
pexp="node: ZM2.*God Daemon.*"
|
|
14
|
+
#rc_bg= # (undefined)
|
|
15
|
+
#rc_reload= # (undefined)
|
|
16
|
+
#rc_usercheck=YES
|
|
17
|
+
|
|
18
|
+
#rc_pre() {
|
|
19
|
+
#}
|
|
20
|
+
|
|
21
|
+
rc_start() {
|
|
22
|
+
${rcexec} "${daemon} ${daemon_flags} resurrect"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#rc_check() {
|
|
26
|
+
# pgrep -T "${daemon_rtable}" -q -xf "${pexp}"
|
|
27
|
+
#}
|
|
28
|
+
|
|
29
|
+
rc_reload() {
|
|
30
|
+
${rcexec} "${daemon} reload all"
|
|
31
|
+
#pkill -HUP -T "${daemon_rtable}" -xf "${pexp}"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#rc_stop() {
|
|
35
|
+
# pkill -T "${daemon_rtable}" -xf "${pexp}"
|
|
36
|
+
#}
|
|
37
|
+
|
|
38
|
+
#rc_post() {
|
|
39
|
+
#}
|
|
40
|
+
|
|
41
|
+
rc_cmd $1
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
# PROVIDE: zm2
|
|
4
|
+
# REQUIRE: LOGIN
|
|
5
|
+
# KEYWORD: shutdown
|
|
6
|
+
|
|
7
|
+
. /etc/rc.subr
|
|
8
|
+
|
|
9
|
+
name="%SERVICE_NAME%"
|
|
10
|
+
rcvar="%SERVICE_NAME%_enable"
|
|
11
|
+
|
|
12
|
+
start_cmd="zm2_start"
|
|
13
|
+
stop_cmd="zm2_stop"
|
|
14
|
+
reload_cmd="zm2_reload"
|
|
15
|
+
status_cmd="zm2_status"
|
|
16
|
+
extra_commands="reload status"
|
|
17
|
+
|
|
18
|
+
zm2()
|
|
19
|
+
{
|
|
20
|
+
env PATH="$PATH:%NODE_PATH%" PM2_HOME="%HOME_PATH%" su -m "%USER%" -c "%PM2_PATH% $*"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
zm2_start()
|
|
24
|
+
{
|
|
25
|
+
zm2 resurrect
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
zm2_stop()
|
|
29
|
+
{
|
|
30
|
+
zm2 kill
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
zm2_reload()
|
|
34
|
+
{
|
|
35
|
+
zm2 reload all
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
zm2_status()
|
|
39
|
+
{
|
|
40
|
+
zm2 list
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
load_rc_config $name
|
|
44
|
+
run_rc_command "$1"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
|
|
3
|
+
<service_bundle type="manifest" name="%SERVICE_NAME%">
|
|
4
|
+
<service name="application/%SERVICE_NAME%" type="service" version="1">
|
|
5
|
+
<create_default_instance enabled="false"/>
|
|
6
|
+
<single_instance/>
|
|
7
|
+
|
|
8
|
+
<dependency name="network" grouping="require_all" restart_on="error" type="service">
|
|
9
|
+
<service_fmri value="svc:/milestone/network:default"/>
|
|
10
|
+
</dependency>
|
|
11
|
+
|
|
12
|
+
<dependency name="filesystem" grouping="require_all" restart_on="error" type="service">
|
|
13
|
+
<service_fmri value="svc:/system/filesystem/local"/>
|
|
14
|
+
</dependency>
|
|
15
|
+
|
|
16
|
+
<method_context>
|
|
17
|
+
<method_environment>
|
|
18
|
+
<envvar name='PATH' value="%NODE_PATH%:/usr/local/sbin:/usr/local/bin:/opt/local/sbin:/opt/local/bin:/usr/sbin:/usr/bin:/sbin"/>
|
|
19
|
+
<envvar name='PM2_HOME' value="%HOME_PATH%"/>
|
|
20
|
+
</method_environment>
|
|
21
|
+
</method_context>
|
|
22
|
+
|
|
23
|
+
<exec_method type="method" name="start" exec="%PM2_PATH% resurrect" timeout_seconds="60"/>
|
|
24
|
+
<exec_method type="method" name="refresh" exec="%PM2_PATH% reload all" timeout_seconds="60"/>
|
|
25
|
+
<exec_method type="method" name="stop" exec="%PM2_PATH% kill" timeout_seconds="60"/>
|
|
26
|
+
|
|
27
|
+
<property_group name="startd" type="framework">
|
|
28
|
+
<propval name="duration" type="astring" value="contract"/>
|
|
29
|
+
<propval name="ignore_error" type="astring" value="core,signal"/>
|
|
30
|
+
</property_group>
|
|
31
|
+
|
|
32
|
+
<property_group name="application" type="application"></property_group>
|
|
33
|
+
<stability value="Evolving"/>
|
|
34
|
+
|
|
35
|
+
<template>
|
|
36
|
+
<common_name>
|
|
37
|
+
<loctext xml:lang="C">
|
|
38
|
+
ZM2 process manager
|
|
39
|
+
</loctext>
|
|
40
|
+
</common_name>
|
|
41
|
+
</template>
|
|
42
|
+
</service>
|
|
43
|
+
</service_bundle>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
Description=ZM2 process manager
|
|
3
|
+
Documentation=https://pm2.keymetrics.io/
|
|
4
|
+
After=network-online.target
|
|
5
|
+
Restart=on-failure
|
|
6
|
+
|
|
7
|
+
[Service]
|
|
8
|
+
Type=forking
|
|
9
|
+
User=%USER%
|
|
10
|
+
LimitNOFILE=infinity
|
|
11
|
+
LimitNPROC=infinity
|
|
12
|
+
LimitCORE=infinity
|
|
13
|
+
Environment=PATH=%NODE_PATH%:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
|
|
14
|
+
Environment=PM2_HOME=%HOME_PATH%
|
|
15
|
+
PIDFile=%HOME_PATH%/zm2.pid
|
|
16
|
+
|
|
17
|
+
ExecStart=%PM2_PATH% resurrect
|
|
18
|
+
ExecReload=%PM2_PATH% reload all
|
|
19
|
+
ExecStop=%PM2_PATH% kill
|
|
20
|
+
|
|
21
|
+
[Install]
|
|
22
|
+
WantedBy=network-online.target
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
Description=ZM2 process manager
|
|
3
|
+
Documentation=https://pm2.keymetrics.io/
|
|
4
|
+
After=network.target
|
|
5
|
+
|
|
6
|
+
[Service]
|
|
7
|
+
Type=forking
|
|
8
|
+
User=%USER%
|
|
9
|
+
LimitNOFILE=infinity
|
|
10
|
+
LimitNPROC=infinity
|
|
11
|
+
LimitCORE=infinity
|
|
12
|
+
Environment=PATH=%NODE_PATH%:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
|
|
13
|
+
Environment=PM2_HOME=%HOME_PATH%
|
|
14
|
+
PIDFile=%HOME_PATH%/zm2.pid
|
|
15
|
+
Restart=on-failure
|
|
16
|
+
|
|
17
|
+
ExecStart=%PM2_PATH% resurrect
|
|
18
|
+
ExecReload=%PM2_PATH% reload all
|
|
19
|
+
ExecStop=%PM2_PATH% kill
|
|
20
|
+
|
|
21
|
+
[Install]
|
|
22
|
+
WantedBy=multi-user.target
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
### BEGIN INIT INFO
|
|
3
|
+
# Provides: zm2
|
|
4
|
+
# Required-Start: $local_fs $remote_fs $network
|
|
5
|
+
# Required-Stop: $local_fs $remote_fs $network
|
|
6
|
+
# Default-Start: 2 3 4 5
|
|
7
|
+
# Default-Stop: 0 1 6
|
|
8
|
+
# Short-Description: ZM2 Init script
|
|
9
|
+
# Description: ZM2 process manager
|
|
10
|
+
### END INIT INFO
|
|
11
|
+
|
|
12
|
+
NAME=zm2
|
|
13
|
+
PM2=%PM2_PATH%
|
|
14
|
+
USER=%USER%
|
|
15
|
+
DEFAULT=/etc/default/$NAME
|
|
16
|
+
|
|
17
|
+
export PATH=%NODE_PATH%:$PATH
|
|
18
|
+
export PM2_HOME="%HOME_PATH%"
|
|
19
|
+
|
|
20
|
+
# The following variables can be overwritten in $DEFAULT
|
|
21
|
+
|
|
22
|
+
# maximum number of open files
|
|
23
|
+
MAX_OPEN_FILES=
|
|
24
|
+
|
|
25
|
+
# overwrite settings from default file
|
|
26
|
+
if [ -f "$DEFAULT" ]; then
|
|
27
|
+
. "$DEFAULT"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# set maximum open files if set
|
|
31
|
+
if [ -n "$MAX_OPEN_FILES" ]; then
|
|
32
|
+
ulimit -n $MAX_OPEN_FILES
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
get_user_shell() {
|
|
36
|
+
local shell
|
|
37
|
+
shell=$(getent passwd "${1:-$(whoami)}" | cut -d: -f7 | sed -e 's/[[:space:]]*$//')
|
|
38
|
+
|
|
39
|
+
if [[ $shell == *"/sbin/nologin" ]] || [[ $shell == "/bin/false" ]] || [[ -z "$shell" ]];
|
|
40
|
+
then
|
|
41
|
+
shell="/bin/bash"
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
echo "$shell"
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
super() {
|
|
48
|
+
local shell
|
|
49
|
+
shell=$(get_user_shell $USER)
|
|
50
|
+
su - "$USER" -s "$shell" -c "PATH=$PATH; PM2_HOME=$PM2_HOME $*"
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
start() {
|
|
54
|
+
echo "Starting $NAME"
|
|
55
|
+
super $PM2 resurrect
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
stop() {
|
|
59
|
+
super $PM2 kill
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
restart() {
|
|
63
|
+
echo "Restarting $NAME"
|
|
64
|
+
stop
|
|
65
|
+
start
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
reload() {
|
|
69
|
+
echo "Reloading $NAME"
|
|
70
|
+
super $PM2 reload all
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
status() {
|
|
74
|
+
echo "Status for $NAME:"
|
|
75
|
+
super $PM2 list
|
|
76
|
+
RETVAL=$?
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
case "$1" in
|
|
80
|
+
start)
|
|
81
|
+
start
|
|
82
|
+
;;
|
|
83
|
+
stop)
|
|
84
|
+
stop
|
|
85
|
+
;;
|
|
86
|
+
status)
|
|
87
|
+
status
|
|
88
|
+
;;
|
|
89
|
+
restart)
|
|
90
|
+
restart
|
|
91
|
+
;;
|
|
92
|
+
reload)
|
|
93
|
+
reload
|
|
94
|
+
;;
|
|
95
|
+
force-reload)
|
|
96
|
+
reload
|
|
97
|
+
;;
|
|
98
|
+
*)
|
|
99
|
+
echo "Usage: {start|stop|status|restart|reload|force-reload}"
|
|
100
|
+
exit 1
|
|
101
|
+
;;
|
|
102
|
+
esac
|
|
103
|
+
exit $RETVAL
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
# Basic HTTP Server and Cluster mode
|
|
3
|
+
|
|
4
|
+
In this boilerplate it will start an http server in cluster mode.
|
|
5
|
+
|
|
6
|
+
You can check the content of the ecosystem.config.js on how to start mutliple instances of the same HTTP application in order to get the most from your working system.
|
|
7
|
+
|
|
8
|
+
## Via CLI
|
|
9
|
+
|
|
10
|
+
Via CLI you can start any HTTP/TCP application in cluster mode with:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
$ pm2 start api.js -i max
|
|
14
|
+
```
|