# 进程
本小节将介绍两方面内容——`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**