From e0864e50ecf917cbfa98d443e6f122425d6447cf Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 26 Jan 2018 14:16:20 -0500 Subject: [PATCH] cluster: add cwd to cluster.settings This commit allows cluster workers to be created with configurable working directories. Fixes: https://github.com/nodejs/node/issues/16388 PR-URL: https://github.com/nodejs/node/pull/18399 Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- doc/api/cluster.md | 2 ++ lib/internal/cluster/master.js | 1 + test/parallel/test-cluster-cwd.js | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 test/parallel/test-cluster-cwd.js diff --git a/doc/api/cluster.md b/doc/api/cluster.md index 6ef451cb9af714..1817ac82027afb 100644 --- a/doc/api/cluster.md +++ b/doc/api/cluster.md @@ -711,6 +711,8 @@ changes: * `exec` {string} File path to worker file. **Default:** `process.argv[1]` * `args` {Array} String arguments passed to worker. **Default:** `process.argv.slice(2)` + * `cwd` {string} Current working directory of the worker process. **Default:** + `undefined` (inherits from parent process) * `silent` {boolean} Whether or not to send output to parent's stdio. **Default:** `false` * `stdio` {Array} Configures the stdio of forked processes. Because the diff --git a/lib/internal/cluster/master.js b/lib/internal/cluster/master.js index 280955549adfa5..570cf7bc6f93d4 100644 --- a/lib/internal/cluster/master.js +++ b/lib/internal/cluster/master.js @@ -126,6 +126,7 @@ function createWorkerProcess(id, env) { } return fork(cluster.settings.exec, cluster.settings.args, { + cwd: cluster.settings.cwd, env: workerEnv, silent: cluster.settings.silent, windowsHide: cluster.settings.windowsHide, diff --git a/test/parallel/test-cluster-cwd.js b/test/parallel/test-cluster-cwd.js new file mode 100644 index 00000000000000..ce3fdca51e907c --- /dev/null +++ b/test/parallel/test-cluster-cwd.js @@ -0,0 +1,22 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const cluster = require('cluster'); + +if (cluster.isMaster) { + common.refreshTmpDir(); + + assert.strictEqual(cluster.settings.cwd, undefined); + cluster.fork().on('message', common.mustCall((msg) => { + assert.strictEqual(msg, process.cwd()); + })); + + cluster.setupMaster({ cwd: common.tmpDir }); + assert.strictEqual(cluster.settings.cwd, common.tmpDir); + cluster.fork().on('message', common.mustCall((msg) => { + assert.strictEqual(msg, common.tmpDir); + })); +} else { + process.send(process.cwd()); + process.disconnect(); +}