Maintain a child process as a nanoresource
$ npm install nanoprocess
Stable
const nanoprocess = require('nanoprocess')
// spawn a comand
const child = nanoprocess(command, args, opts)
// open process and query for stats
child.open((err) => {
child.stat((err, stats) => {
console.log(stats)
})
})
The following example spawns a node process that spawns a sleep
command running for 2 seconds while also doing a lot of work
(Array(10e7).fill(crypto.randomBytes(1024));
). The example will query
for process stats and leverage the progress module to output
process memory and CPU usage.
const prettyBytes = require('pretty-bytes')
const nanoprocess = require('nanoprocess')
const prettyTime = require('pretty-ms')
const Progress = require('progress')
const template = [
'> :name (:pid)',
'up for :uptime',
'CPU: :cpu%',
'MEM: :mem',
':pidsCount child process(es)'
].join(' | ')
const sleep = nanoprocess('node', [
'-e',
'process.title = "sleep";' +
'require("cross-spawn")("sleep", [2]);' +
'Array(10e7).fill(crypto.randomBytes(1024));'
])
const bar = new Progress(template, {
width: 20,
total: 1
})
sleep.open((err) => {
console.log('> opened')
let timer = 0
sleep.stat(function onstat(err, stats) {
if (stats) {
bar.update(0, {
pidsCount: stats.pids.length,
uptime: prettyTime(stats.uptime),
name: stats.name,
mem: prettyBytes(stats.memory),
cpu: Math.floor(stats.cpu),
pid: stats.pid,
})
}
if (stats && stats.uptime > 2000 && 0 === stats.cpu) {
bar.update(1, stats)
sleep.close()
} else if (!err) {
clearTimeout(timer)
timer = setTimeout(() => sleep.stat(onstat), 100)
}
})
sleep.process.on('close', () => {
console.log('')
console.log('> closed')
})
})
$ node example.js
> opened
> sleep (33153) | up for 5.2s | CPU: 99% | MEM: 1.25 GB | 1 child process(es)
> closed
The nanoprocess
function returns a new Process
instance
that extends nanoresource.
const child = nanoprocess('sleep', [2])
child.open((err) => {
// process is opened
})
Create a new Process
instance from command
with
optional args
and options
that are given to
cross-spawn when the child process is
opened.
const ls = nanoprocess('ls', ['.'])
ls.open((err) => {
ls.process.stdout.pipe(process.stdout)
})
The nanoprocess
exports the Process
class that can
be extended.
const { Process } = require('nanoprocess')
class InstallDependencies extends Process {
constructor(dirname) {
super('npm', ['install'], { cwd: dirname })
}
}
const install = new InstallDependencies('path/to/dir')
install.open(() => {
// stat loop
install.stat(function onstat(err, stats) {
console.log(stats) // Stats { cpu: 14.23, ... }
install.stat(onstat)
})
install.process.on('close', (err) => {
console.log('closed')
})
})
Create a new Process
instance from command
with
optional args
and options
that are given to
cross-spawn when the child process is
opened.
The initial options
given to the Process
instance
constructor which are given to cross-spawn when
the child process is opened.
The command to spawn when the child process is opened.
When the child process is opened, this will be an instance of
child_process.ChildProcess
.
The child process ID.
The child process parent process ID.
The child process stdin
stream. This may be null
.
The child process stdout
stream. This may be null
.
The child process stderr
stream. This may be null
.
The child process channel
object. This may be null
.
The child process connection state.
The child process killed state.
The child process exit signal. This value can be null
. Check this
after the child process has closed.
The child process exit code. This value can be null
. Check this after
the child process has closed.
The arguments for the child process command given to cross-spawn when the child process is opened.
Opens the child process by spawning a
command with optional arguments and
options calling callback(err)
when opened or if an
error occurs during the spawning of the child process.
Closes the child process and all decedent child process in the process
tree calling callback(err)
when closed or if an error occurs during
the closing of the spawned child process. Setting allowActive
to
false
(default) will cause a 'SIGTERM'
to be sent to the child process
causing it to close. You can call child.kill({ force: true })
prior to
calling this method if you want force the processed to be killed. Set
allowActive
to true
to wait for the process to close on its and mark
the nanoresource instance inactive.
Kill the child process calling callback
when killed or if can error
occurs. Set opts.true
to force the processed to be killed.
Queries for statistics about the running child process for information
like cpu usage and memory
consumption calling callback(err, stats)
with a
stats object or if an error occurs.
child.stat((err, stats) => {
// handle stats
})
The output of the stats
object may look something like:
Stats {
bin: 'sleep',
uid: 1000,
gid: 1000,
cpu: 138.46153845657875,
pid: 33792,
ppid: 33785,
pids: [ 33810 ],
name: 'sleep',
atime: 1572118184405,
uptime: 680,
memory: 241070080,
command: 'node' }
The initial binary used invoke the child process.
The user ID of the child process.
The group ID of the child process.
The current CPU usage as a percentage of the child process.
The child process ID.
The parent process ID of the child process.
The child process IDs of the child process
The name of process
The time stamp in milliseconds this stat was accessed.
Time in milliseconds since process spawned
Memory usage in bytes
The command used to start the process
true
if the process or any child process in the pidtree for
the root child process is still running.
MIT