Module 基礎模塊

模塊child_process

子進程管理模塊

引用方式:

1 2
var child_process = require("child_process"); var child = child_process.spawn("ls");

在創建子進程時,options.stdio 選項用於配置在父進程和子進程之間建立的管道。默認情況下,子進程的stdin、 stdout 和stderr 會被重定向到ChildProcess對像上相應的stdin、stdout 和stderr 流。這相當於將options.stdio 設置為['pipe', 'pipe', 'pipe']。

為方便起見, options.stdio 可以是以下字符串之一:

  • 'pipe':相當於['pipe', 'pipe', 'pipe'](默認值)。
  • 'ignore':相當於['ignore', 'ignore', 'ignore']。
  • 'inherit':相當於['inherit', 'inherit', 'inherit'] 或[0, 1, 2]。
  • 'pty':相當於['pty', 'pty', 'pty']。不支持Windows。

否則, options.stdio 的值需是數組(其中每個索引對應於子進程中的文件描述符)。文件描述符0、1 和2 分別對應於stdin、stdout 和stderr。其他的文件描述符可以被指定用於在父進程和子進程之間創建其他的管道。值可以是以下之一:

  1. 'pipe':在子進程和父進程之間創建管道。管道的父端作為child_process 對像上的stdio[fd] 屬性暴露給父進程。為文件描述符0、1 和2 創建的管道也可分別作為stdin、stdout 和stderr 使用。
  2. 'ignore':指示fibjs 忽略子進程中的文件描述符。雖然fibjs 將會始終為其衍生的進程打開文件描述符0、1 和2,但將文件描述符設置為'ignore' 可以使fibjs 打開/dev/null 並將其附加到子進程的文件描述符。
  3. 'inherit':將相應的stdio 流傳給父進程或從父進程傳入。在前三個位置中,這分別相當於process.stdinprocess.stdoutprocess.stderr在任何其他位置中,則相當於'ignore'。
  4. 'pty':在子進程將在虛擬終端中執行。此時只有stdin 和stdout 有效。
  5. 正整數:整數值會被解釋為當前在父進程中打開的文件描述符。它與子進程共享,類似於共享<Stream> 對象的方式。在Windows 上不支持傳入socket。
  6. null 或undefined:使用默認值。對於stdio 的文件描述符0、1 和2(換句話說,stdin、stdout 和stderr),將會創建管道。對於文件描述符3 及更大的值,則默認為'ignore'。
1 2 3 4 5 6 7 8 9 10 11 12 13
const { spawn } = require('child_process'); // 子进程使用父进程的 stdio。 spawn('prg', [], { stdio: 'inherit' }); // 衍生的子进程只共享 stderr。 spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] });

對於同時使用nodejs 的用戶, 需注意

  • fibjs的child_process.exec(command, args)和nodejs的同名api功能類似,但在windows上,並不會自動將cmd.exe作為command參數的執行環境;
  • fibjs 的child_process.[spawn|exec|execFile|run] 是同步/回調一體的async 風格函數:
    • 如果最後一個參數不是函數, 則是同步的
    • 如果傳遞了函數作為最後一個參數, 則是異步的;
  • fibjs的child_process.[exec|execFile]的返回結果是一個對象,該對象和nodejs同名api返回的對象完全不相同
  • fibjs的child_process.run在nodejs中沒有對應API

靜態函數

spawn

用給定的命令發布一個子進程

1 2 3
static ChildProcess child_process.spawn(String command, Array args, Object options = {});

調用參數:

  • command: String, 指定要運行的命令
  • args: Array, 指定字符串參數列表
  • options: Object, 指定創建參數

返回結果:

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "stdio": Array | String, // 子进程 stdio 配置 "env": {}, // 环境变量的键值对 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

用給定的命令發布一個子進程

1 2
static ChildProcess child_process.spawn(String command, Object options = {});

調用參數:

  • command: String, 指定要運行的命令
  • options: Object, 指定創建參數

返回結果:

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "stdio": Array | String, // 子进程 stdio 配置 "env": {}, // 环境变量的键值对 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

exec

在shell 中執行一個命令並緩衝輸出,當以回調方式執行時,函數將返回子進程對象

1 2
static (Variant stdout, Variant stderr) child_process.exec(String command, Object options = {}) async;

調用參數:

  • command: String, 指定要運行的命令
  • options: Object, 指定創建參數

返回結果:

  • (Variant stdout, Variant stderr), 返回子進程的stdio 輸出內容

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "env": {}, // 环境变量的键值对 "encoding": "utf8", // 指定返回结果的编码,缺省为 utf8 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

execFile

直接執行所指定的文件並緩衝輸出,當以回調方式執行時,函數將返回子進程對象

1 2 3
static (Variant stdout, Variant stderr) child_process.execFile(String command, Array args, Object options = {}) async;

調用參數:

  • command: String, 指定要運行的命令
  • args: Array, 指定字符串參數列表
  • options: Object, 指定創建參數

返回結果:

  • (Variant stdout, Variant stderr), 返回子進程的stdio 輸出內容

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "env": {}, // 环境变量的键值对 "encoding": "utf8", // 指定返回结果的编码,缺省为 utf8 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

直接執行所指定的文件並緩衝輸出,當以回調方式執行時,函數將返回子進程對象

1 2
static (Variant stdout, Variant stderr) child_process.execFile(String command, Object options = {}) async;

調用參數:

  • command: String, 指定要運行的命令
  • options: Object, 指定創建參數

返回結果:

  • (Variant stdout, Variant stderr), 返回子進程的stdio 輸出內容

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "env": {}, // 环境变量的键值对 "encoding": "utf8", // 指定返回结果的编码,缺省为 utf8 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

fork

在子進程中執行一個模塊

1 2 3
static ChildProcess child_process.fork(String module, Array args, Object options = {});

調用參數:

  • module: String, 指定要運行的命令
  • args: Array, 指定字符串參數列表
  • options: Object, 指定創建參數

返回結果:

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "stdio": Array | String, // 子进程 stdio 配置 "env": {}, // 环境变量的键值对 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

在子進程中執行一個模塊

1 2
static ChildProcess child_process.fork(String module, Object options = {});

調用參數:

  • module: String, 指定要運行的命令
  • options: Object, 指定創建參數

返回結果:

options 支持的內容如下:

1 2 3 4 5 6 7 8 9 10
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "stdio": Array | String, // 子进程 stdio 配置 "env": {}, // 环境变量的键值对 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

run

直接執行所指定的文件並返回exitCode,當以回調方式執行時,函數將返回子進程對象

1 2 3
static Integer child_process.run(String command, Array args, Object options = {}) async;

調用參數:

  • command: String, 指定要運行的命令
  • args: Array, 指定字符串參數列表
  • options: Object, 指定創建參數

返回結果:

  • Integer, 返回子進程的exitCode

options 支持的內容如下:

1 2 3 4 5 6 7 8 9
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "env": {}, // 环境变量的键值对 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }

直接執行所指定的文件並返回exitCode,當以回調方式執行時,函數將返回子進程對象

1 2
static Integer child_process.run(String command, Object options = {}) async;

調用參數:

  • command: String, 指定要運行的命令
  • options: Object, 指定創建參數

返回結果:

  • Integer, 返回子進程的exitCode

options 支持的內容如下:

1 2 3 4 5 6 7 8 9
{ "cwd": "", // 子进程的当前的工作目录,缺省使用当前目录 "env": {}, // 环境变量的键值对 "detached": false, // 子进程将会变成一个进程组的领导者,缺省为 false "uid": 0, // 设置用户进程的ID "gid": 0, // 设置进程组的ID "windowsVerbatimArguments": false, // 在 Windows上不执行引号或转义参数。 在 Unix 上被忽略。 当指定外壳且为 CMD 时,此选项将自动设置为true,缺省为 false "windowsHide": false // 隐藏通常在Windows系统上创建的子进程控制台窗口,缺省为 false }