# 進程
本小節將介紹兩方面內容——`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**