zoukankan      html  css  js  c++  java
  • Node child_process 备忘

    首先是对应的 官方api 

    区别

    其实都是基于 spawn 和 spawnSync

      特点 windows linux&mac

    spawn

    (spawnSync)

    使用流    

    exec

    (execSync)

     衍生 shell 并且在 shell 中运行命令,将命令的输出 stdout 和 stderr放到缓冲区,当完成时则传给回调函数(shell: true)

       

    execFile

    (execFileSync)

    同上,但默认情况下它会直接衍生命令而不先衍生 shell .bat 和 .cmd 文件在没有终端的情况下不能自行执行,所以不好使 比上更高效
    fork 衍生新的 Node.js 进程,并调用指定的模块,该模块已建立了 IPC 通信通道(stdio: 'ipc')    

    创建异步的静默子进程

    // 官方示例,方便做笔记
    
    const fs = require('fs');
    const { spawn } = require('child_process');
    const out = fs.openSync('./out.log', 'a');
    const err = fs.openSync('./out.log', 'a'); // 方便查看子进程输出
    
    const subprocess = spawn('prg', [], {
      detached: true,  // 子进程在父进程退出后继续运行
      stdio: [ 'ignore', out, err ] // 不能是默认值 inherit 或有 ipc
    });
    
    // 父进程的事件循环不会将子进程包含在其引用计数中,使得父进程可以独立于子进程退出
    subprocess.unref();

    通信

    父子进程之间存在 ipc 通信的时候,可以通过 process.on message 和 process.send 来实现通信。如果期望同步效果,可以使用 promise 来包裹整个方法体。

    不存在 ipc 通信的时候,可以通过 nedb 或 log 等来间接通信。nedb 需要注意每次 update 都会再追加一项,在 read 的时候再去压缩成一条,或者可以设置自动压缩任务。

    其他

    1、父进程 env 默认传 process.env 到子进程,但是 spawn 会自动 stringify 这个 env 参数,所以父进程的复杂环境变量在子进程还是得单独引入

    2、可以通过 process.title = xxx 的形式来给子进程特殊命名,方便使用 ps 或 tasklist 来查看子进程的存活情况。此举还可以用来 kill 不期望的子进程。需要注意的事子进程存活并不代表子进程正常运行,可以通过 nedb 写心跳的形式来判断子进程的存活。

    3、想起来了再写

  • 相关阅读:
    mysql基础语句
    .opt,frm,.MYD,.MYI文件如何转为.sql文件?
    如何使用phpstudy本地搭建多站点(每个站点对应不同的端口)
    吐槽下微软的vs code编辑器
    补码的两个重要问题
    注意力不集中是因为你没有紧迫感
    弧度与角度的转换公式推导
    ps图层面板上的【透明度】与【填充】的区别
    【ctrl+A】与【ctrl+单击图层缩略图】有什么区别?
    DRF-认证 权限 频率组件
  • 原文地址:https://www.cnblogs.com/codetker/p/13662767.html
Copyright © 2011-2022 走看看