-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathchild.js
75 lines (56 loc) · 1.53 KB
/
child.js
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
module.exports = function(userOptions) {
var obj = {},
process = {},
stopCb,
stopOrder = false
var options = {
command: userOptions.command || false,
args: userOptions.args || null,
options: userOptions.options || [],
autoRestart: userOptions.autoRestart || false,
restartTimeout: userOptions.restartTimeout || 200,
cbRestart: userOptions.cbRestart || function(data) {},
cbStdout: userOptions.cbStdout || null,
cbStderr: userOptions.cbStderr || null,
cbClose: userOptions.cbClose || function(data) {},
}
obj.start = function(cb) {
stopOrder = false;
process = require('child_process').spawn(options.command, options.args, options.options);
if (options.cbStdout)
process.stdout.on('data', options.cbStdout)
if (options.cbStderr)
process.stderr.on('data', options.cbStderr)
process.on('close', function(code) {
// Default close cb
options.cbClose(code)
// Stop CB ?
if (stopOrder == true)
stopCb(code);
// Auto-restarting ?
if (stopOrder == false && options.autoRestart == true) {
// AutoRestart CB
options.cbRestart(code)
setTimeout(obj.start, options.restartTimeout)
}
})
if (cb)
cb(process.pid)
}
obj.stop = function(cb, termSignal) {
stopOrder = true
stopCb = cb || function() {}
process.kill(termSignal || 'SIGTERM')
}
obj.restart = function(cb, termSignal) {
// Stop
obj.stop(function() {
// Wait and start again
setTimeout(function() {
obj.start();
if (cb) cb();
}, options.restartTimeout);
}, termSignal);
}
return obj;
}