diff --git a/README.md b/README.md index a60e9aa..819c291 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ var monitor = respawn(['node', 'server.js'], { kill:30000, // wait 30s before force killing after stopping stdio: [...], // forward stdio options fork: true // fork instead of spawn + execPath: 'exec/path' // executable used to create the child process, if `fork` is `true` + execArgv: [...], // list of string arguments passed to the executable, if `fork` is `true` }) monitor.start() // spawn and watch diff --git a/index.js b/index.js index d73dbd4..7dd0273 100644 --- a/index.js +++ b/index.js @@ -54,6 +54,8 @@ var Monitor = function(command, opts) { this.stderr = opts.stderr this.silent = opts.silent this.windowsVerbatimArguments = opts.windowsVerbatimArguments + this.execPath = opts.execPath + this.execArgv = opts.execArgv this.spawnFn = opts.fork ? fork : spawn @@ -118,6 +120,8 @@ Monitor.prototype.start = function() { gid: self.gid, stdio: self.stdio, silent: self.silent, + execPath: self.execPath, + execArgv: self.execArgv, windowsVerbatimArguments: self.windowsVerbatimArguments }) diff --git a/test/apps/forkExecPath.js b/test/apps/forkExecPath.js new file mode 100644 index 0000000..b83545f --- /dev/null +++ b/test/apps/forkExecPath.js @@ -0,0 +1,4 @@ +process.send({ + execPath: process.execPath, + execArgv: process.execArgv +}) diff --git a/test/index.js b/test/index.js index b83a011..06abbd8 100644 --- a/test/index.js +++ b/test/index.js @@ -1,6 +1,8 @@ var test = require('tap').test var path = require('path') var util = require('util') +var os = require('os') +var fs = require('fs') var respawn = require('../index') var crash = path.join(__dirname, 'apps', 'crash.js') @@ -8,6 +10,7 @@ var run = path.join(__dirname, 'apps', 'run.js') var hello = path.join(__dirname, 'apps', 'hello-world.js') var env = path.join(__dirname, 'apps', 'env.js') var fork = path.join(__dirname, 'apps', 'fork.js') +var forkExecPath = path.join(__dirname, 'apps', 'forkExecPath.js') var node = process.execPath test('restart', function(t) { @@ -311,3 +314,45 @@ test('fork', function(t) { mon.start() }) + +test('fork with a custom execPath and execArgv', function(t) { + t.plan(1) + + var mon + var messages = [] + + var symlinkName = os.platform() === 'win32' ? 'node-symlink.exe' : 'node-symlink' + var symlinkPath = path.join(__dirname, symlinkName) + var execArgv = ['--preserve-symlinks'] + + fs.symlink(node, symlinkName, () => { + mon = respawn([forkExecPath], { + fork:true, + maxRestarts:1, + sleep:1, + execPath: symlinkPath, + execArgv: execArgv + }) + + mon.on('message', function(message) { + messages.push(message) + }) + + mon.on('stop', function() { + t.deepEqual(messages, [ + {execPath: symlinkPath, execArgv: execArgv}, + {execPath: symlinkPath, execArgv: execArgv} + ]) + }) + + mon.start() + }) + + t.tearDown(() => { + if (fs.existsSync(symlinkPath)) { + fs.unlinkSync(symlinkPath, (err) => { + if (err) console.error(err) + }) + } + }) +})