mirror of
https://github.com/Unitech/pm2.git
synced 2025-12-08 20:35:53 +00:00
Merge branch 'development' of https://github.com/Unitech/PM2 into development
This commit is contained in:
commit
7e883caf21
@ -12,7 +12,7 @@
|
||||
- [Options](#a987)
|
||||
- [Schema](#schema)
|
||||
- [How to update PM2?](#update-pm2)
|
||||
- [PM2 auto-completion](#auto-completion)
|
||||
- [PM2 tab-completion](#tab-completion)
|
||||
- [Allow PM2 to bind apps on port 80/443 without root](#authbind-pm2)
|
||||
|
||||
### Features
|
||||
@ -266,27 +266,34 @@ Then update the in-memory PM2 :
|
||||
$ pm2 update
|
||||
```
|
||||
|
||||
<a name="auto-completion"/>
|
||||
## PM2 auto-completion
|
||||
<a name="tab-completion"/>
|
||||
## PM2 tab-completion
|
||||
|
||||
Tab-completion for pm2.
|
||||
|
||||
Append pm2 completion script to your .bashrc or .zshrc file:
|
||||
|
||||
```bash
|
||||
$ pm2 completion install
|
||||
```
|
||||
Or manually append completion script to your ~/.bashrc or ~/.zshrc file:
|
||||
|
||||
Add pm2 completion to your current session:
|
||||
```bash
|
||||
$ pm2 completion >> ~/.bashrc # or ~/.zshrc
|
||||
```
|
||||
|
||||
Then source your .bashrc or .zshrc file for current session:
|
||||
|
||||
```bash
|
||||
$ source ~/.bashrc # or ~/.zshrc
|
||||
```
|
||||
|
||||
You can add pm2 completion to your current session this way:
|
||||
|
||||
```bash
|
||||
$ . <(pm2 completion)
|
||||
```
|
||||
|
||||
Manually append completion script to your ~/.bashrc or ~/.zshrc file:
|
||||
|
||||
```bash
|
||||
$ pm2 completion >> ~/.bashrc
|
||||
```
|
||||
|
||||
<a name="authbind-pm2"/>
|
||||
## Allow PM2 to bind applications on ports 80/443 without root
|
||||
|
||||
|
||||
13
CHANGELOG.md
13
CHANGELOG.md
@ -1,13 +1,18 @@
|
||||
# 0.14.3
|
||||
# 0.14.4
|
||||
|
||||
- New command : `pm2 iprobe [app_name|app_id|'ALL']`
|
||||
|
||||
# 0.14.3 (Current Stable)
|
||||
|
||||
- `pm2 flush` now flushes pm2.log as well
|
||||
- New flag : `--no-treekill` : when used PM2 won't kill children processes
|
||||
- New flags : `pm2 logs [ 'all' | 'PM2' | app_name | app_id] [--err | --out] [--lines <n>] [--raw] [--timestamp [format]]`
|
||||
- Enhancement: Module installable via Github: `pm2 install username/repository`
|
||||
- New flags : `pm2 logs ['all'|'PM2'|app_name|app_id] [--err|--out] [--lines <n>] [--raw] [--timestamp [format]]`
|
||||
- Enhancement: Modules installable via Github: `pm2 install username/repository`
|
||||
- Feature: PMX has *scoped function* -> pm2 stores temporary output from custom functions
|
||||
- Fix: Interactor issue when doing an heapdump
|
||||
- Feature: PM2 CLI autocompletion
|
||||
|
||||
# 0.14.2 (Current Stable)
|
||||
# 0.14.2
|
||||
|
||||
- Improved pm2-dev
|
||||
- Now when apps list is empty, the `id` counter is set to 0
|
||||
|
||||
12
bin/pm2
12
bin/pm2
@ -126,7 +126,7 @@ function checkCompletion(){
|
||||
return data.short;
|
||||
}), data);
|
||||
// array containing commands after which process name should be listed
|
||||
var cmdProcess = ['stop', 'restart', 'scale', 'reload', 'gracefulReload', 'delete', 'reset', 'pull', 'forward', 'backward'];
|
||||
var cmdProcess = ['stop', 'restart', 'scale', 'reload', 'gracefulReload', 'delete', 'reset', 'pull', 'forward', 'backward', 'logs', 'describe', 'desc', 'show'];
|
||||
if(cmdProcess.indexOf(data.prev) > -1) {
|
||||
CLI.connect(function() {
|
||||
CLI.list(function(err, list){
|
||||
@ -688,6 +688,16 @@ commander.command('gc')
|
||||
CLI.forceGc();
|
||||
});
|
||||
|
||||
//
|
||||
// Display probes in a graphical way
|
||||
//
|
||||
commander.command('iprobe [app_name|app_id]')
|
||||
.description('displays probes in a graphical way')
|
||||
.action(function(pm2_id) {
|
||||
pm2_id = pm2_id || 'ALL';
|
||||
CLI.IProbe(pm2_id);
|
||||
});
|
||||
|
||||
//
|
||||
// Catch all
|
||||
//
|
||||
|
||||
55
lib/CLI.js
55
lib/CLI.js
@ -1484,6 +1484,61 @@ CLI.describe = function(pm2_id, cb) {
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Description
|
||||
* @method IProbe
|
||||
* @param {} pm2_id
|
||||
* @return
|
||||
*/
|
||||
CLI.IProbe = function(pm2_id) {
|
||||
|
||||
var getProbeData = function(pm2_id, cb) {
|
||||
Satan.executeRemote('getMonitorData', {}, function(err, list) {
|
||||
if (err) {
|
||||
printError('Error retrieving process list: ' + err);
|
||||
exitCli(cst.ERROR_EXIT);
|
||||
}
|
||||
|
||||
var found_proc = [];
|
||||
|
||||
list.forEach(function(proc) {
|
||||
if ((!isNaN(parseInt(pm2_id)) && proc.pm_id == pm2_id)
|
||||
|| (typeof(pm2_id) === 'string' && proc.name == pm2_id)
|
||||
|| pm2_id === 'ALL') {
|
||||
found_proc.push(proc);
|
||||
}
|
||||
});
|
||||
|
||||
if (found_proc.length === 0) {
|
||||
return cb(['{bold}No probes to display{/bold}']);
|
||||
}
|
||||
|
||||
var content = [];
|
||||
|
||||
found_proc.forEach(function(proc) {
|
||||
content.push('{bold}' + proc.pm2_env.name + ' (id:' + proc.pm2_env.pm_id + ')' + '{/bold}');
|
||||
|
||||
var monit = proc.pm2_env.axm_monitor;
|
||||
for (var k in monit)
|
||||
content.push(k + ' : ' + monit[k].value);
|
||||
|
||||
content.push('\n');
|
||||
});
|
||||
|
||||
return cb(content);
|
||||
});
|
||||
};
|
||||
|
||||
var iprobe = new require('./IProbe.js')();
|
||||
|
||||
setInterval(function() {
|
||||
getProbeData(pm2_id, function(content) {
|
||||
iprobe.refresh(content);
|
||||
});
|
||||
}, 300);
|
||||
};
|
||||
|
||||
/**
|
||||
* Description
|
||||
* @method reloadLogs
|
||||
|
||||
60
lib/IProbe.js
Normal file
60
lib/IProbe.js
Normal file
@ -0,0 +1,60 @@
|
||||
var blessed = require('blessed');
|
||||
|
||||
var IProbe = function() {
|
||||
if (!(this instanceof IProbe))
|
||||
return new IProbe();
|
||||
|
||||
this.screen = blessed.screen({
|
||||
autoPadding: true,
|
||||
smartCSR: true
|
||||
});
|
||||
|
||||
this.screen.title = 'PM2 realtime probes';
|
||||
|
||||
this.box = blessed.box({
|
||||
scrollable: true,
|
||||
alwaysScroll: true,
|
||||
keys: true,
|
||||
scrollbar: {
|
||||
fg: 'red',
|
||||
ch: '|'
|
||||
},
|
||||
|
||||
top: 'center',
|
||||
left: 'center',
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
content: 'Fetching probes...',
|
||||
align : "center",
|
||||
valign : "middle",
|
||||
tags: true,
|
||||
border: {
|
||||
type: 'line'
|
||||
},
|
||||
style: {
|
||||
fg: '#33ffff',
|
||||
bg: 'black',
|
||||
border: {
|
||||
fg: '#33ffff'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
this.screen.append(this.box);
|
||||
|
||||
this.screen.key(['escape', 'q', 'C-c'], function(ch, key) {
|
||||
return process.exit(0);
|
||||
});
|
||||
this.box.focus();
|
||||
this.screen.render();
|
||||
};
|
||||
|
||||
IProbe.prototype.refresh = function(content) {
|
||||
if (!content || !content.length)
|
||||
return;
|
||||
|
||||
this.box.setContent(content.join('\n'));
|
||||
this.screen.render();
|
||||
};
|
||||
|
||||
module.exports = IProbe;
|
||||
@ -141,7 +141,7 @@ function install(name, completer, cb) {
|
||||
|
||||
var part = file.split(markerIn)[1];
|
||||
if(part) {
|
||||
return cb(null, ' ✗ ' + completer + ' has been already installed. Do nothing.');
|
||||
return cb(null, ' ✗ ' + completer + ' tab-completion has been already installed. Do nothing.');
|
||||
}
|
||||
|
||||
rc = file;
|
||||
@ -158,7 +158,7 @@ function install(name, completer, cb) {
|
||||
|
||||
writeRc(rc + scriptOutput, function(err) {
|
||||
if(err) return cb(err);
|
||||
return cb(null, ' ✓ ' + completer + ' installed.');
|
||||
return cb(null, ' ✓ ' + completer + ' tab-completion installed.');
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -172,13 +172,13 @@ function uninstall(name, completer, cb) {
|
||||
|
||||
var part = file.split(markerIn)[1];
|
||||
if(!part) {
|
||||
return cb(null, ' ✗ ' + completer + ' has been already uninstalled. Do nothing.');
|
||||
return cb(null, ' ✗ ' + completer + ' tab-completion has been already uninstalled. Do nothing.');
|
||||
}
|
||||
|
||||
part = markerIn + part.split(markerOut)[0] + markerOut;
|
||||
writeRc(file.replace(part, ''), function(err) {
|
||||
if(err) return cb(err);
|
||||
return cb(null, ' ✓ ' + completer + ' uninstalled.');
|
||||
return cb(null, ' ✓ ' + completer + ' tab-completion uninstalled.');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
###-begin-pm2-completion-###
|
||||
### credits to for the completion file model
|
||||
### credits to npm for the completion file model
|
||||
#
|
||||
# Installation: pm2 completion >> ~/.bashrc (or ~/.zshrc)
|
||||
#
|
||||
@ -35,6 +35,6 @@ elif type compctl &>/dev/null; then
|
||||
2>/dev/null)) || return $?
|
||||
IFS="$si"
|
||||
}
|
||||
compctl -K _pm2_completion pm2
|
||||
compctl -K _pm2_completion + -f + pm2
|
||||
fi
|
||||
###-end-pm2-completion-###
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "pm2",
|
||||
"preferGlobal": "true",
|
||||
"version": "0.14.2",
|
||||
"version": "0.14.3",
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
},
|
||||
@ -173,6 +173,7 @@
|
||||
|
||||
"shelljs" : "0.5.1",
|
||||
"isbinaryfile" : "^2.0.3",
|
||||
"blessed" : "0.1.61",
|
||||
"semver" : "4.3.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user