node.js之process和child_process

process

process.env

// NODE_ENV=production node app.js
// NODE_ENV=dvelopment node app.js
if(process.env.NODE_ENV === 'production'){
    console.log('生产环境');
}else{
    console.log('非生产环境');
}

process.nextTick(fn)

  1. process.nextTick将放在node事件循环的下次tick中
  2. process.nextTick(fn)比setTimeout的性能要更高
// 执行结果:  s1  s2   ss
console.log('s1');
process.nextTick(function(){
    console.log('ss');
});
console.log('s2');

process.argv
即获取命令行:node + 文件 + 参数, 如下:

// NODE_ENV=development node argv.js  --env production
process.argv.forEach(function(val, index, array) {
  console.log('参数' + index + ': ' + val);
});
// 参数传入env为production,但更改process.env.NODE_ENV为development

process.cwd()\process.chdir()

// 获取当前路径
console.log('Starting directory: ' + process.cwd());
try {
// 切换到tmp下,没有即创建
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}catch (err) {
  console.log('chdir: ' + err);
}

process.connect()与process.disconnect()

var child_process = require('child_process');

child_process.fork('./connectedChild.js', {
  stdio: 'inherit'
});
// connectedChild.js
console.log( 'process.connected: ' + process.connected );
process.disconnect();
console.log( 'process.connected: ' + process.connected );

// 输出:
// process.connected: true
// process.connected: false

标准输入输出信息和错误信息的处理 process.stdin、process.stdout、process.stderr

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write(`data: ${chunk}`);
  }
});

process.stdin.on('end', () => {
  process.stdout.write('end');
});

系统相关信息

  • 运行情况/资源占用情况: process.uptime()、process.memoryUsage()
  • 进程信息: process.pid\title
  • 用户/组信息:process.seteuid(id)、 process.geteuid().........
  • 环境信息: process. platform:返回关于平台描述的字符串,比如 darwin、win32 等。
  • 处理器信息: process.arch: 返回当前系统的处理器架构(字符串),比如'arm', 'ia32', or 'x64'。
子进程相关功能
const spawn = async (...args) => {
  const { spawn } = require('child_process');
  return new Promise(resolve => {
    const proc = spawn(...args)
    proc.stdout.pipe(process.stdout)
    proc.stderr.pipe(process.stderr)
    proc.on('close', () => {
      resolve()
    })
  })
}
// 执行spawn('npm', ['install'], { cwd: `./${name}` })

1.exec - child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式一次性返回。exec方法会从子进程中返回一个完整的buffer。默认情况下,这个buffer的大小应该是200k。如果子进程返回的数据大小超过了200k,程序将会崩溃,同时显示错误信息“Error:maxBuffer exceeded”。你可以通过在exec的可选项中设置一个更大的buffer体积来解决这个问题,但是你不应该这样做,因为exec本来就不是用来返回很多数据的方法。

2.spawn - child_process.spawn 使用指定的命令行参数创建新进程。spawn 会返回一个带有stdout和stderr流的对象。你可以通过stdout流来读取子进程返回给Node.js的数据。stdout拥有’data’,’end’以及一般流所具有的事件。当你想要子进程返回大量数据给Node时,比如说图像处理,读取二进制数据等等,你最好使用spawn方法。

3.fork - child_process.fork 是 spawn()的特殊形式,用于在子进程中运行的模块,如 fork(‘./son.js’) 相当于 spawn(‘node’, [‘./son.js’]) 。与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,通过process.send和on("message")通信。

你可能感兴趣的:(node.js之process和child_process)