# 进程 本小节将介绍两方面内容——`process`(主进程)和`child_process`(子进程)。 [TOC] ## [process(主进程)](http://nodejs.cn/api/process.html) >`process `对象是一个` global `(全局变量),提供有关信息,控制当前 `NodeJs `进程。作为一个对象,它对于` NodeJs`应用程序始终是可用的,故无需使用 `require()`。 ### 常用属性和方法 这里会简单介绍`process`的常用属性和方法,对于`NodeJs`中文网已经做了详尽翻译的,这只是以超链接的方式提供,你可以直接点击跳转。 #### process.argv **`process.argv`属性返回一个数组,该数组包含当`NodeJs`进程启动时,命令行传递到进程的参数。数组的第一个元素是*[process.execPath](http://nodejs.cn/api/process.html#process_process_execpath)*返回的结果(即执行`NodeJs`进程的执行程序的绝对路径名称,如`/usr/local/bin/node`),数组的第二个元素是被执行文件的名称,剩下的元素可以是任何命令行参数(用户可以自定义)** * `process.argv` * `<Array>` 例子: ~~~ //index.js // 遍历并打印process.argv process.argv.forEach(function(val, index) { console.log(index + ':' + val) }); ~~~ 上面的例子我们把代码写在`index.js`文件中,现在我们打开命令行,使用下面的命令启动`NodeJs`进程: ~~~ $ node index.js one two=three four ~~~ 回车运行,命令行输出下面的结果: ~~~ 0: /usr/local/bin/node 1: /Users/outsider/develop/node/process/index.js 2: one 3: two=three 4: four ~~~ 其中,数组第一个元素`process.argv[0]=“/usr/local/bin/node”`,这是我电脑上`node`执行程序的路径,数组的第二个元素`process.argv[1]=“/Users/outsider/develop/node/process/index.js”`是`index.js`文件的路径 #### process.chdir(directory) **将`NodeJs`进程当前工作目录切换为目标目录,和你在命令行使用`cd directory`一样效果,如果目标目录不存在,则抛出异常。** * ` process.chdir(directory)` * `directory <String>`:目标目录路径 #### process.cwd() **获取当前`NodeJs`进程所在的工作目录** * `process.cwd()` * `Returns: <String>`:返回当前`NodeJs`进程所在的工作目录 #### process.exit([code]) **调用`process.exit()`方法可以强制结束当前`NodeJs`进程。** * `process.exit([code])` * `code <Integer> `:进程退出码,默认值是0,即正常退出 >Note: 一般情况下,我们不会主动调用`process.exit()`,这是因为一旦调用`process.exit()`方法,`NodeJs`进程会以最快的速度响应退出进程的指令,即使现在`NodeJs`进程中还有一些异步程序没执行完成,也不会等它执行完。 在程序开发过程中,很多时候,我们需要表达程序是非正常退出的,这个时候我们向程序调用者输出各种标志信息。官网建议我们通过以下两种方式实现 1.直接设置`process.exitCode`(即进程退出码),然后返回。 2.抛出一个异常 #### process.pid **每个进程启动的时候`NodeJs`都会分配为其一个唯一的进程ID。** * ` process.pid` * ` <Integer>`:进程ID(整形数据) >一种应用场景: 假如你用`NodeJs`写了一个服务程序,服务器启动之后,你又写了一个守护程序保活,如果服务器程序由于未知原因挂起了,并且过了预设时间仍然没有恢复,这时,你就可以强制关闭该进程,开启一个新的进程。这个过程,你需要先记住服务进程的`pid`,然后在需要的时候调用`process.kill(pid)`杀掉指定进程。 #### process.kill(pid[, signal]) **杀死指定`pid`的进程,如果该`pid`不存在,则抛出异常** * ` process.kill(pid[, signal])` * ` pid <number>`:一个进程ID * `signal <String> | <number>`:传递到指定`pid`进程的信号信息。默认值是”SIGTERM“ #### process.platform **`process.platform`属性将返回系统的标识符**,比如:`'darwin', 'freebsd', 'linux', 'sunos' or 'win32'`,这个属性可以用于判断当前`NodeJs`进程运行在哪个系统上。 * ` process.platform` * ` <String>`:当前系统的标识符。 #### [process.stderr](http://nodejs.cn/api/process.html#process_process_stderr) #### [process.stdin](http://nodejs.cn/api/process.html#process_process_stdin) #### [process.stdout](http://nodejs.cn/api/process.html#process_process_stdout) ## [child_process(子进程)](http://nodejs.cn/api/child_process.html#child_process_child_process) >`child_process `模块提供了衍生子进程的能力 `child_process `模块很重要,他是命令行脚本程序开发必不可少的一环,有了`child_process`你可以在主程序中,开启一个新的进程,执行其他程序任务。 `NodeJs`中文网提供了较为完整的`API`翻译,所以,这里不再赘述。 `child_process`需要重点关注以下两个方法: 1. [spawn](http://nodejs.cn/api/child_process.html#child_process_child_process_spawn_command_args_options) 2. [execFileSync](http://nodejs.cn/api/child_process.html#child_process_child_process_execfilesync_file_args_options) >Tips: `child_process`一章的阅读可以适当囫囵吞枣,下一小节,我们将介绍`shelljs`——`child_process`的一个封装模块,处理子进程相当简单。 ## process和child_process API地址: **process中文网地址:http://nodejs.cn/api/process.html** **child_porcess中文网地址:http://nodejs.cn/api/child_process.html**