diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index 6d64c636b24435..28b9afe1cf9404 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -149,7 +149,10 @@ function wrapProcessMethods(binding) { process._exiting = true; process.emit('exit', process.exitCode || 0); } - binding.reallyExit(process.exitCode || 0); + // FIXME(joyeecheung): This is an undocumented API that gets monkey-patched + // in the user land. Either document it, or deprecate it in favor of a + // better public alternative. + process.reallyExit(process.exitCode || 0); } function kill(pid, sig) { diff --git a/test/parallel/test-process-really-exit.js b/test/parallel/test-process-really-exit.js new file mode 100644 index 00000000000000..c806d6c4aa4808 --- /dev/null +++ b/test/parallel/test-process-really-exit.js @@ -0,0 +1,17 @@ +'use strict'; +require('../common'); +const assert = require('assert'); + +// ensure that the reallyExit hook is executed. +// see: https://github.com/nodejs/node/issues/25650 +if (process.argv[2] === 'subprocess') { + process.reallyExit = function() { + console.info('really exited'); + }; + process.exit(); +} else { + const { spawnSync } = require('child_process'); + const out = spawnSync(process.execPath, [__filename, 'subprocess']); + const observed = out.output[1].toString('utf8').trim(); + assert.strictEqual(observed, 'really exited'); +}