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()
.
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.
Outputs the master / worker process ids.
cluster> pids()
pids
master: 1799
worker #0: 1801
worker #1: 1802
worker #2: 1803
worker #3: 1804
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
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 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
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
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);