_pm2 5.74 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/bin/zsh -f
#compdef pm2
#autoload

local -a _1st_arguments

_1st_arguments=(
    "start:start and daemonize an app"
    "trigger:trigger process action"
    "deploy:deploy your json"
    "startOrRestart:start or restart JSON file"
    "startOrReload:start or gracefully reload JSON file"
    "pid:return pid of [app_name] or all"
    "stop:stop a process"
    "restart:restart a process"
    "scale:scale up/down a process in cluster mode depending on total_number param"
    "profile\:mem:Sample PM2 heap memory"
    "profile\:cpu:Profile PM2 cpu"
    "reload:reload processes (note that its for app using HTTP/HTTPS)"
    "id:get process id by name"
    "inspect:inspect a process"
    "delete:stop and delete a process from pm2 process list"
    "sendSignal:send a system signal to the target process"
    "ping:ping pm2 daemon - if not up it will launch it"
    "updatePM2:update in-memory PM2 with local PM2"
    "install:install or update a module and run it forever"
    "module\:update:update a module and run it forever"
    "module\:generate:Generate a sample module in current folder"
    "uninstall:stop and uninstall a module"
    "package:Check & Package TAR type module"
    "publish:Publish the module you are currently on"
    "set:sets the specified config <key> <value>"
    "multiset:multiset eg \"key1 val1 key2 val2\""
    "get:get value for <key>"
    "config:get / set module config values"
    "unset:clears the specified config <key>"
    "report:give a full pm2 report for https\://github.com/Unitech/pm2/issues"
    "link:link with the pm2 monitoring dashboard"
    "unlink:unlink with the pm2 monitoring dashboard"
    "monitor:monitor target process"
    "unmonitor:unmonitor target process"
    "open:open the pm2 monitoring dashboard"
    "plus:enable pm2 plus"
    "login:Login to pm2 plus"
    "logout:Logout from pm2 plus"
    "web:launch a health API on 0.0.0.0\:9615"
    "dump:dump all processes for resurrecting them later"
    "cleardump:Create empty dump file"
    "send:send stdin to <pm_id>"
    "attach:attach stdin/stdout to application identified by <pm_id>"
    "resurrect:resurrect previously dumped processes"
    "unstartup:disable the pm2 startup hook"
    "startup:enable the pm2 startup hook"
    "logrotate:copy default logrotate configuration"
    "ecosystem:generate a process conf file. (mode = null or simple)"
    "reset:reset counters for process"
    "describe:describe all parameters of a process id"
    "list:list all processes"
    "jlist:list all processes in JSON format"
    "prettylist:print json in a prettified JSON"
    "monit:launch termcaps monitoring"
    "imonit:launch legacy termcaps monitoring"
    "dashboard:launch dashboard with monitoring and logs"
    "flush:flush logs"
    "reloadLogs:reload all logs"
    "logs:stream logs file. Default stream all logs"
    "kill:kill daemon"
    "pull:updates repository for a given app"
    "forward:updates repository to the next commit for a given app"
    "backward:downgrades repository to the previous commit for a given app"
    "deepUpdate:performs a deep update of PM2"
    "serve:serve a directory over http via port"
    "examples:display pm2 usage examples"
)

local -a id_names

_id_names() {
    local app_list
    app_list=`pm2 list -m`

    local -a names ids 
    names=(`echo $app_list | grep '+---' | awk '{print $2}'`)
    ids=(`echo $app_list | grep 'pm2 id' | awk '{print $4}'`)

    if (( ${#ids} > 0 )); then
        for i in {1..${#ids}}; do
            id_names+=( "${ids[i]}:${names[i]}" )
        done
    fi
}

_arguments \
    '(-v --version)'{-v,--version}'[output version]' \
    '(-h --help)'{-h,--help}'[output usage information]' \
    '*:: :->subcmds' && return 0

if (( CURRENT == 1 )); then
    _describe "command" _1st_arguments
    return
fi

local -a id_comp id_all_comp id_all_files_comp start_options logs_options
id_comp=('1: :->id_comp')
id_all_comp=('1: :->id_all_comp')
id_all_files_comp=('1: :->id_all_files_comp')
start_options=(
    '--watch[Watch folder for changes]'
    '--fresh[Rebuild Dockerfile]'
    '--daemon[Run container in Daemon mode (debug purposes)]'
    '--container[Start application in container mode]'
    '--dist[with --container; change local Dockerfile to containerize all files in current directory]'
    '--image-name[with --dist; set the exported image name]'
    '--node-version[with --container, set a specific major Node.js version]'
    '--dockerdaemon[for debugging purpose]'
    '(-h --help)'{-h,--help}'[output usage information]'
    $id_all_files_comp
)
logs_options=(
    '--json[json log output]'
    '--format[formated log output]'
    '--raw[raw output]'
    '--err[only shows error output]'
    '--out[only shows standard output]'
    '--lines[output the last N lines, instead of the last 15 by default]'
    '--timestamp[add timestamps (default format YYYY-MM-DD-HH:mm:ss)]'
    '--nostream[print logs without lauching the log stream]'
    '(-h --help)'{-h,--help}'[output usage information]'
    $id_all_comp
)

case "$words[1]" in
    start)
        _arguments $start_options && return 0
        ;;
    logs)
        _arguments $logs_options && return 0
        ;;
    stop|restart|delete|reload|reset)
        _arguments $id_all_comp && return 0
        ;;
    env|inspect|monitor|unmonitor|discribe)
        _arguments $id_comp && return 0
        ;;
    deploy|startOrRestart|startOrReload)
        _files ;;
esac

case "$state" in
    id_comp)
        _id_names
        _alternative \
            'args:app args:(($id_names))'
        ;;
    id_all_comp)
        _id_names
        id_names+=(all)
        _alternative \
            'args:app args:(($id_names))'
        ;;
    id_all_files_comp)
        _id_names
        id_names+=(all)
        _alternative \
            'args:app args:(($id_names))' \
            'files:filename:_files'
        ;;
esac