165 lines
3.9 KiB
Markdown
165 lines
3.9 KiB
Markdown
|
|
## REPL
|
|
|
|
Provides live administration tools for inspecting state, spawning and killing workers, and more. The __REPL__ plugin itself is extensible, for example the `stats()` plugin provides a __REPL__ function named `stats()`.
|
|
|
|
### Usage
|
|
|
|
The `repl([port | path])` accepts a `port` or unix domain socket `path`, after which you may telnet to at any time.
|
|
|
|
Launch the __REPL__ with a local socket:
|
|
|
|
cluster(server)
|
|
.use(cluster.repl('/var/run/cluster.sock'))
|
|
.listen(3000);
|
|
|
|
Start a telnet session:
|
|
|
|
$ telnet /var/run/cluster.sock
|
|
|
|
cluster> help()
|
|
|
|
Commands
|
|
help(): Display help information
|
|
spawn(n): Spawn one or more additional workers
|
|
pids(): Output process ids
|
|
kill(id, signal): Send signal or SIGTERM to the given worker
|
|
shutdown(): Gracefully shutdown server
|
|
stop(): Hard shutdown
|
|
restart(): Gracefully restart all workers
|
|
echo(msg): echo the given message
|
|
stats(): Display server statistics
|
|
|
|
__NOTE__: a local socket is recommended, otherwise this may be a secure hole.
|
|
|
|
### pids()
|
|
|
|
Outputs the master / worker process ids.
|
|
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1799
|
|
worker #0: 1801
|
|
worker #1: 1802
|
|
worker #2: 1803
|
|
worker #3: 1804
|
|
|
|
### spawn()
|
|
|
|
Spawn an additional worker.
|
|
|
|
cluster> spawn()
|
|
spawning 1 worker
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1799
|
|
worker #0: 1801
|
|
worker #1: 1802
|
|
worker #2: 1803
|
|
worker #3: 1804
|
|
worker #4: 1809
|
|
|
|
### spawn(n)
|
|
|
|
Spawn `n` workers:
|
|
|
|
cluster> spawn(4)
|
|
spawning 4 workers
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1817
|
|
worker #0: 1818
|
|
worker #1: 1819
|
|
worker #2: 1820
|
|
worker #3: 1821
|
|
worker #4: 1825
|
|
worker #5: 1826
|
|
worker #6: 1827
|
|
worker #7: 1828
|
|
|
|
### kill(id[, signal])
|
|
|
|
Kill worker `id` with the given `signal` or __SIGTERM__. For graceful termination use __SIGQUIT__.
|
|
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1835
|
|
worker #0: 1837
|
|
worker #1: 1838
|
|
worker #2: 1839
|
|
worker #3: 1840
|
|
|
|
cluster> kill(2)
|
|
sent SIGTERM to worker #2
|
|
cluster> kill(3)
|
|
sent SIGTERM to worker #3
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1835
|
|
worker #0: 1837
|
|
worker #1: 1838
|
|
worker #2: 1843
|
|
worker #3: 1844
|
|
|
|
### restart()
|
|
|
|
Gracefully restart all workers.
|
|
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1835
|
|
worker #0: 1837
|
|
worker #1: 1838
|
|
worker #2: 1843
|
|
worker #3: 1844
|
|
|
|
cluster> restart()
|
|
restarting 4 workers
|
|
cluster> pids()
|
|
|
|
pids
|
|
master: 1835
|
|
worker #0: 1845
|
|
worker #1: 1849
|
|
worker #2: 1848
|
|
worker #3: 1847
|
|
|
|
### Defining REPL Functions
|
|
|
|
To define a function accessible to the __REPL__, all we need to do is call `cluster.repl.define()`, passing the function, as well as a description string.
|
|
|
|
Below we define the `echo()` function, simply printing the input `msg` given. As you can see our function receivers the `Master` instance, the __REPL__ `sock`, and any arguments that were passed. For example `echo("test")` would pass the `msg` as `"test"`, and `echo("foo", "bar")` would pass `msg` as `"foo"`, and `arguments[3]` as `"bar"`.
|
|
|
|
repl.define('echo', function(master, sock, msg){
|
|
sock.write(msg + '\n');
|
|
}, 'echo the given message');
|
|
|
|
Shown below is a more complete example.
|
|
|
|
var cluster = require('../')
|
|
, repl = cluster.repl
|
|
, http = require('http');
|
|
|
|
var server = http.createServer(function(req, res){
|
|
var body = 'Hello World';
|
|
res.writeHead(200, { 'Content-Length': body.length });
|
|
res.end(body);
|
|
});
|
|
|
|
// custom repl function
|
|
|
|
repl.define('echo', function(master, sock, msg){
|
|
sock.write(msg + '\n');
|
|
}, 'echo the given message');
|
|
|
|
// $ telnet localhots 8888
|
|
|
|
cluster(server)
|
|
.use(repl(8888))
|
|
.listen(3000); |