IO.js Process

2018-11-28 22:34 更新

process對象是一個(gè)全局對象,并且何以被在任何地方調(diào)用。這是一個(gè)EventEmitter實(shí)例。

Exit Codes

當(dāng)沒有任何異步操作在等待時(shí),io.js通常將會(huì)以一個(gè)0為退出碼退出。以下這些狀態(tài)碼會(huì)在其他情況下被用到:

  • 1 未捕獲的致命異常。這是一個(gè)未捕獲的異常,并且它沒有被domain處理,也沒有被uncaughtException處理。
  • 2 未使用(由Bash為內(nèi)建誤操作保留)。
  • 3 內(nèi)部的JavaScript解析錯(cuò)誤。io.js內(nèi)部的JavaScript源碼引導(dǎo)(bootstrapping)造成的一個(gè)解釋錯(cuò)誤。這極其罕見。并且常常只會(huì)發(fā)生在io.js自身的開發(fā)過程中。
  • 4 內(nèi)部的JavaScript求值錯(cuò)誤。io.js內(nèi)部的JavaScript源碼引導(dǎo)(bootstrapping)未能在求值時(shí)返回一個(gè)函數(shù)值。這極其罕見。并且常常只會(huì)發(fā)生在io.js自身的開發(fā)過程中。
  • 5 致命錯(cuò)誤。這是V8中嚴(yán)重的不可恢復(fù)的錯(cuò)誤。典型情況下,一個(gè)帶有FATAL ERROR前綴的信息會(huì)被打印在stderr
  • 6 內(nèi)部異常處理函數(shù)喪失功能。這是一個(gè)未捕獲異常,但是內(nèi)部的致命異常處理函數(shù)被設(shè)置為喪失功能,并且不能被調(diào)用。
  • 7 內(nèi)部異常處理函數(shù)運(yùn)行時(shí)失敗。這是一個(gè)未捕獲異常,并且內(nèi)部致命異常處理函數(shù)試圖處理它時(shí),自身拋出了一個(gè)錯(cuò)誤。例如它可能在當(dāng)process.on('uncaughtException')domain.on('error')處理函數(shù)拋出錯(cuò)誤時(shí)發(fā)生。
  • 8 未使用。io.js的之前版本中,退出碼8通常表示一個(gè)未捕獲異常。
  • 9 無效參數(shù)。當(dāng)一個(gè)位置的選項(xiàng)被指定,或者一個(gè)必選的值沒有被提供。
  • 10 內(nèi)部的JavaScript運(yùn)行時(shí)錯(cuò)誤。io.js內(nèi)部的JavaScript源碼引導(dǎo)(bootstrapping)函數(shù)被調(diào)用時(shí)拋出一個(gè)錯(cuò)誤。這極其罕見。并且常常只會(huì)發(fā)生在io.js自身的開發(fā)過程中。
  • 12 無效的調(diào)試參數(shù)。--debug和/或--debug-brk選項(xiàng)被設(shè)置,當(dāng)時(shí)選擇了一個(gè)無效的端口。
  • 大于128 信號(hào)退出。如果io.js收到了一個(gè)如SIGKILLSIGHUP的致命信號(hào),那么它將以一個(gè)128加上 信號(hào)碼的值 的退出碼退出。這是一個(gè)標(biāo)準(zhǔn)的Unix實(shí)踐,因?yàn)橥顺龃a由一個(gè)7位整數(shù)定義,并且信號(hào)的退出設(shè)置了一個(gè)高順序位(high-order bit),然后包含一個(gè)信號(hào)碼的值。

Event: 'exit'

進(jìn)程即將退出時(shí)觸發(fā)。在這個(gè)時(shí)刻已經(jīng)沒有辦法可以阻止事件循環(huán)的退出,并且一旦所有的exit監(jiān)聽器運(yùn)行結(jié)束時(shí),進(jìn)程將會(huì)退出。因此,在這個(gè)監(jiān)聽器中你僅僅能調(diào)用同步的操作。這是檢查模塊狀態(tài)(如單元測試)的好鉤子。回調(diào)函數(shù)有一個(gè)退出碼參數(shù)。

例子:

process.on('exit', function(code) {
  // do *NOT* do this
  setTimeout(function() {
    console.log('This will not run');
  }, 0);
  console.log('About to exit with code:', code);
});

Event: 'beforeExit'

這個(gè)事件在io.js清空了它的事件循環(huán)并且沒有任何已安排的任務(wù)時(shí)觸發(fā)。通常io.js當(dāng)沒有更多被安排的任務(wù)時(shí)就會(huì)退出,但是beforeExit中可以執(zhí)行異步調(diào)用,讓io.js繼續(xù)運(yùn)行。

beforeExit在程序被顯示終止時(shí)不會(huì)觸發(fā),如process.exit()或未捕獲的異常。除非想去安排更多的任務(wù),否則它不應(yīng)被用來做為exit事件的替代。

Event: 'uncaughtException'

當(dāng)一個(gè)異常冒泡回事件循環(huán)時(shí)就會(huì)觸發(fā)。如果這個(gè)時(shí)間被添加了監(jiān)聽器,那么默認(rèn)行為(退出程序且打印堆棧跟蹤信息)將不會(huì)發(fā)生。

例子:

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});

setTimeout(function() {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

注意,uncaughtException來處理異常是非常粗糙的。

請不要使用它,使用domain來替代。如果你已經(jīng)使用了它,請?jiān)诓惶幚磉@個(gè)異常之后重啟你的應(yīng)用。

請不要像io.jsError Resume Next這樣使用。一個(gè)未捕獲異常意味著你的應(yīng)用或拓展有未定義的狀態(tài)。盲目地恢復(fù)意味著任何事都可能發(fā)生。

想象你在升級(jí)你的系統(tǒng)時(shí)電源被拉斷了。10次中前9次都沒有問題,但是第10次時(shí),你的系統(tǒng)崩潰了。

你已經(jīng)被警告。

Event: 'unhandledRejection'

在一個(gè)事件循環(huán)中,當(dāng)一個(gè)promise被“拒絕”并且沒有附屬的錯(cuò)誤處理函數(shù)時(shí)觸發(fā)。當(dāng)一個(gè)帶有promise異常的程序被封裝為被“拒絕”的promise時(shí),這樣的程序的錯(cuò)誤可以被promise.catch(...)捕獲處理并且“拒絕”會(huì)通過promise鏈冒泡。這個(gè)事件對于偵測和保持追蹤那些“拒絕”沒有被處理的promise非常有用。這個(gè)事件會(huì)帶著以下參數(shù)觸發(fā):

  • reason promise的“拒絕”對象(通常是一個(gè)錯(cuò)誤實(shí)例)
  • p 被“拒絕”的promise

下面是一個(gè)把所有未處理的“拒絕”打印到控制臺(tái)的例子:

process.on('unhandledRejection', function(reason, p) {
    console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
    // application specific logging, throwing an error, or other logic here
});

下面是一個(gè)會(huì)觸發(fā)unhandledRejection事件的“拒絕”:

somePromise.then(function(res) {
  return reportToUser(JSON.pasre(res)); // note the typo
}); // no `.catch` or `.then`

Event: 'rejectionHandled'

當(dāng)一個(gè)Promise被“拒絕”并且一個(gè)錯(cuò)誤處理函數(shù)被附給了它(如.catch())時(shí)的下一個(gè)事件循環(huán)之后觸發(fā)。這個(gè)事件會(huì)帶著以下參數(shù)觸發(fā):

  • p 一個(gè)在之前會(huì)被觸發(fā)在unhandledRejection事件中,但現(xiàn)在被處理函數(shù)捕獲的promise

一個(gè)promise鏈的頂端沒有 “拒絕”可以總是被處理 的概念。由于其異步的本質(zhì),一個(gè)promise的“拒絕”可以在未來的某一個(gè)時(shí)間點(diǎn)被處理,可以是在事件循環(huán)中被觸發(fā)unhandledRejection事件之后。

另外,不像同步代碼中是一個(gè)永遠(yuǎn)增長的 未捕獲異常 列表,promise中它是一個(gè)可伸縮的 未捕獲拒絕 列表。在同步代碼中,uncaughtException事件告訴你 未捕獲異常 列表增長了。但是在promise中,unhandledRejection事件告訴你 未捕獲“拒絕” 列表增長了,rejectionHandled事件告訴你 未捕獲“拒絕” 列表縮短了。

使用“拒絕”偵測鉤子來保持一個(gè)被“拒絕”的promise列表:

var unhandledRejections = [];
process.on('unhandledRejection', function(reason, p) {
    unhandledRejections.push(p);
});
process.on('rejectionHandled', function(p) {
    var index = unhandledRejections.indexOf(p);
    unhandledRejections.splice(index, 1);
});

Signal Events

當(dāng)一個(gè)進(jìn)程收到一個(gè)信號(hào)時(shí)觸發(fā)。參閱sigaction(2)。

監(jiān)聽SIGINT信號(hào)的例子:

// Start reading from stdin so we don't exit.
process.stdin.resume();

process.on('SIGINT', function() {
  console.log('Got SIGINT.  Press Control-D to exit.');
});

一個(gè)發(fā)送SIGINT信號(hào)的快捷方法是在大多數(shù)終端中按下 Control-C 。

注意:

  • SIGUSR1 是io.js用于開啟調(diào)試的保留信號(hào)??梢詾槠涮砑右粋€(gè)監(jiān)聽器,但不能阻止調(diào)試的開始。
  • SIGTERM 和 SIGINT在非Windows平臺(tái)下有在以 128 + 信號(hào) 退出碼退出前重置終端模式的默認(rèn)監(jiān)聽器。如果另有監(jiān)聽器被添加,默認(rèn)監(jiān)聽器會(huì)被移除(即io.js將會(huì)不再退出)。
  • SIGPIPE 默認(rèn)被忽略,可以被添加監(jiān)聽器。
  • SIGHUP 當(dāng)控制臺(tái)被關(guān)閉時(shí)會(huì)在Windows中產(chǎn)生,或者其他平臺(tái)有其他相似情況時(shí)(參閱signal(7))。它可以被添加監(jiān)聽器,但是Windows中io.js會(huì)無條件的在10秒后關(guān)閉終端。在其他非Windows平臺(tái),它的默認(rèn)行為是結(jié)束io.js,但是一旦被添加了監(jiān)聽器,默認(rèn)行為會(huì)被移除。
  • SIGTERM 在Windows中不被支持,它可以被監(jiān)聽。
  • SIGINT 支持所有的平臺(tái)??梢杂?CTRL+C 產(chǎn)生(盡管它可能是可配置的)。當(dāng)啟用終端的raw mode時(shí),它不會(huì)產(chǎn)生。
  • SIGBREAK 在Windows中,按下 CTRL+BREAK 時(shí)它會(huì)產(chǎn)生。在非Windows平臺(tái)下,它可以被監(jiān)聽,但它沒有產(chǎn)生的途徑。
  • SIGWINCH 當(dāng)終端被改變大小時(shí)產(chǎn)生。Windows下,它只會(huì)在當(dāng)光標(biāo)被移動(dòng)時(shí)寫入控制臺(tái)或可讀tty使用raw mode時(shí)發(fā)生。
  • SIGKILL 可以被添加監(jiān)聽器。它會(huì)無條件得在所有平臺(tái)下關(guān)閉io.js。
  • SIGSTOP 可以被添加監(jiān)聽器。

注意Windows不支持發(fā)送信號(hào),但io.js通過process.kill()child_process.kill()提供了模擬:- 發(fā)送信號(hào)0被用來檢查進(jìn)程的存在 - 發(fā)送SIGINT, SIGTERM 和 SIGKILL 會(huì)導(dǎo)致目標(biāo)進(jìn)程的無條件退出。

process.stdout

一個(gè)指向stdout的可寫流。

例如,console.log可能與這個(gè)相似:

console.log = function(msg) {
  process.stdout.write(msg + '\n');
};

io.js中,process.stderrprocess.stdout與其他流不同,因?yàn)樗麄儾荒鼙魂P(guān)閉(調(diào)用end()會(huì)報(bào)錯(cuò))。它們永遠(yuǎn)不觸發(fā)finish事件并且寫操作通常是阻塞的。

  • 當(dāng)指向普通文件或TTY文件描述符時(shí),它們是阻塞的。

  • 以下情況下他們指向流

  • 他們在Linux/Unix中阻塞
  • 他們在Windows中的其他流里不阻塞

若要檢查io.js是否在一個(gè)TTY上下文中運(yùn)行,讀取process.stderr,process.stdoutprocess.stdinisTTY屬性:

$ iojs -p "Boolean(process.stdin.isTTY)"
true
$ echo "foo" | iojs -p "Boolean(process.stdin.isTTY)"
false

$ iojs -p "Boolean(process.stdout.isTTY)"
true
$ iojs -p "Boolean(process.stdout.isTTY)" | cat
false

更多信息請參閱tty文檔。

process.stderr

一個(gè)指向stderr的可寫流。

io.js中,process.stderrprocess.stdout與其他流不同,因?yàn)樗麄儾荒鼙魂P(guān)閉(調(diào)用end()會(huì)報(bào)錯(cuò))。它們永遠(yuǎn)不觸發(fā)finish事件并且寫操作通常是阻塞的。

  • 當(dāng)指向普通文件或TTY文件描述符時(shí),它們是阻塞的。

  • 以下情況下他們指向流

  • 他們在Linux/Unix中阻塞
  • 他們在Windows中的其他流里不阻塞

process.stdin

一個(gè)指向stdin的可讀流。

一個(gè)打開標(biāo)準(zhǔn)輸入并且監(jiān)聽兩個(gè)事件的例子:

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write('data: ' + chunk);
  }
});

process.stdin.on('end', function() {
  process.stdout.write('end');
});

作為一個(gè)流,process.stdin可以被切換至“舊”模式,這樣就可以兼容node.js v0.10 前所寫的腳本。更多信息請參閱 流的兼容性 。

在“舊”模式中stdin流默認(rèn)是被暫停的。所以你必須調(diào)用process.stdin.resume()來讀取。注意調(diào)用process.stdin.resume()這個(gè)操作本身也會(huì)將流切換至舊模式。

如果你正將開啟一個(gè)新的工程。你應(yīng)該要更常使用“新”模式的流。

process.argv

一個(gè)包含了命令行參數(shù)的數(shù)組。第一次元素將會(huì)是'iojs',第二個(gè)元素將會(huì)是JavaScript文件名。之后的元素將會(huì)是額外的命令行參數(shù)。

// print process.argv
process.argv.forEach(function(val, index, array) {
  console.log(index + ': ' + val);
});

這將會(huì)是:

$ iojs process-2.js one two=three four
0: iojs
1: /Users/mjr/work/iojs/process-2.js
2: one
3: two=three
4: four

process.execPath

這將是開啟進(jìn)程的可執(zhí)行文件的絕對路徑名:

例子:

/usr/local/bin/iojs

process.execArgv

這是在啟動(dòng)時(shí)io.js自身參數(shù)的集合。這些參數(shù)不會(huì)出現(xiàn)在process.argv中,并且不會(huì)包含io.js可執(zhí)行文件,腳本名和其他腳本名之后的參數(shù)。這些參數(shù)對開啟和父進(jìn)程相同執(zhí)行環(huán)境的子進(jìn)程非常有用。

例子:

$ iojs --harmony script.js --version

process.execArgv將會(huì)是:

['--harmony']

process.argv將會(huì)是:

['/usr/local/bin/iojs', 'script.js', '--version']

process.abort()

這將導(dǎo)致io.js觸發(fā)abort事件。這個(gè)將導(dǎo)致io.js退出,并創(chuàng)建一個(gè)核心文件。

process.chdir(directory)

為進(jìn)程改變當(dāng)前工作目錄,如果失敗,則拋出一個(gè)異常。

console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

process.cwd()

返回進(jìn)程的當(dāng)前工作目錄。

console.log('Current directory: ' + process.cwd());

process.env

包含用戶環(huán)境變量的對象。參閱environ(7)。

一個(gè)例子:

{ TERM: 'xterm-256color',
  SHELL: '/usr/local/bin/bash',
  USER: 'maciej',
  PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
  PWD: '/Users/maciej',
  EDITOR: 'vim',
  SHLVL: '1',
  HOME: '/Users/maciej',
  LOGNAME: 'maciej',
  _: '/usr/local/bin/iojs' }

你可以改寫這個(gè)對象,但是改變不會(huì)反應(yīng)在你的進(jìn)程之外。這以為著以下代碼不會(huì)正常工作:

$ iojs -e 'process.env.foo = "bar"' && echo $foo

但是以下代碼會(huì):

process.env.foo = 'bar';
console.log(process.env.foo);

process.exit([code])

使用指定的退出碼退出程序,如果忽略退出碼。那么將使用“成功”退出碼0。

以一個(gè)“失敗”退出碼結(jié)束:

process.exit(1);

在執(zhí)行io.js的shell中可以看到為1的退出碼。

process.exitCode

將是程序退出碼的數(shù)字,當(dāng)程序優(yōu)雅退出 或 被process.exit()關(guān)閉且沒有指定退出碼時(shí)。

process.exit(code)指定一個(gè)退出碼會(huì)覆蓋之前的process.exitCode設(shè)置。

process.getgid()

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

獲取進(jìn)程的群組標(biāo)識(shí)(參閱getgid(2))。這是一個(gè)群組id數(shù)組,不是群組名。

if (process.getgid) {
  console.log('Current gid: ' + process.getgid());
}

process.getegid()

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

獲取進(jìn)程的有效群組標(biāo)識(shí)(參閱getgid(2))。這是一個(gè)群組id數(shù)組,不是群組名。

if (process.getegid) {
  console.log('Current gid: ' + process.getegid());
}

process.setgid(id)

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

設(shè)置進(jìn)程的群組標(biāo)識(shí)(參閱setgid(2))。它接受一個(gè)數(shù)字ID或一個(gè)群組名字符串。如果群組名被指定,那么這個(gè)方法將在解析群組名為一個(gè)ID的過程中阻塞。

if (process.getgid && process.setgid) {
  console.log('Current gid: ' + process.getgid());
  try {
    process.setgid(501);
    console.log('New gid: ' + process.getgid());
  }
  catch (err) {
    console.log('Failed to set gid: ' + err);
  }
}

process.setegid(id)

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

設(shè)置進(jìn)程的有效群組標(biāo)識(shí)(參閱setgid(2))。它接受一個(gè)數(shù)字ID或一個(gè)群組名字符串。如果群組名被指定,那么這個(gè)方法將在解析群組名為一個(gè)ID的過程中阻塞。

if (process.getegid && process.setegid) {
  console.log('Current gid: ' + process.getegid());
  try {
    process.setegid(501);
    console.log('New gid: ' + process.getegid());
  }
  catch (err) {
    console.log('Failed to set gid: ' + err);
  }
}

process.getuid()

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

獲取進(jìn)程的用戶id(參閱getuid(2))。這是一個(gè)數(shù)字用戶id,不是用戶名。

if (process.getuid) {
  console.log('Current uid: ' + process.getuid());
}

process.geteuid()

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

獲取進(jìn)程的有效用戶id(參閱getuid(2))。這是一個(gè)數(shù)字用戶id,不是用戶名。

if (process.geteuid) {
  console.log('Current uid: ' + process.geteuid());
}

process.setuid(id)

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

設(shè)置進(jìn)程的用戶ID(參閱setuid(2))。它接受一個(gè)數(shù)字ID或一個(gè)用戶名字符串。如果用戶名被指定,那么這個(gè)方法將在解析用戶名為一個(gè)ID的過程中阻塞。

if (process.getuid && process.setuid) {
  console.log('Current uid: ' + process.getuid());
  try {
    process.setuid(501);
    console.log('New uid: ' + process.getuid());
  }
  catch (err) {
    console.log('Failed to set uid: ' + err);
  }
}

process.seteuid(id)

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

設(shè)置進(jìn)程的有效用戶ID(參閱seteuid(2))。它接受一個(gè)數(shù)字ID或一個(gè)用戶名字符串。如果用戶名被指定,那么這個(gè)方法將在解析用戶名為一個(gè)ID的過程中阻塞。

if (process.geteuid && process.seteuid) {
  console.log('Current uid: ' + process.geteuid());
  try {
    process.seteuid(501);
    console.log('New uid: ' + process.geteuid());
  }
  catch (err) {
    console.log('Failed to set uid: ' + err);
  }
}

process.getgroups()

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

返回一個(gè)補(bǔ)充群組ID的數(shù)組。如果包含了有效的組ID,POSIX將不會(huì)指定。但io.js保證它始終是。

process.setgroups(groups)

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

設(shè)置一個(gè)補(bǔ)充群組ID。這是一個(gè)特殊的操作,意味著你需要擁有rootCAP_SETGID權(quán)限才可以這么做。

列表可以包含群組ID,群組名,或兩者。

process.initgroups(user, extra_group)

注意:這個(gè)函數(shù)只在POSIX平臺(tái)上有效(如在Windows,Android中無效)。

讀取/etc/group并且初始化群組訪問列表,使用用戶是組員的所有群組。這是一個(gè)特殊的操作,意味著你需要擁有rootCAP_SETGID權(quán)限才可以這么做。

user是一個(gè)用戶名或一個(gè)用戶ID。extra_group是一個(gè)群組名或群組ID。

當(dāng)你注銷權(quán)限時(shí)有些需要關(guān)心的:

console.log(process.getgroups());         // [ 0 ]
process.initgroups('bnoordhuis', 1000);   // switch user
console.log(process.getgroups());         // [ 27, 30, 46, 1000, 0 ]
process.setgid(1000);                     // drop root gid
console.log(process.getgroups());         // [ 27, 30, 46, 1000 ]

process.version

一個(gè)暴露NODE_VERSION的編譯時(shí)存儲(chǔ)屬性。

console.log('Version: ' + process.version);

process.versions

一個(gè)暴露io.js版本和它的依賴的字符串屬性。

console.log(process.versions);

將可能打?。?/p>

{ http_parser: '2.3.0',
  node: '1.1.1',
  v8: '4.1.0.14',
  uv: '1.3.0',
  zlib: '1.2.8',
  ares: '1.10.0-DEV',
  modules: '43',
  openssl: '1.0.1k' }

process.config

一個(gè)表示用于編譯當(dāng)前io.js執(zhí)行文件的配置的JavaScript對象。這和運(yùn)行./configure腳本產(chǎn)生的config.gypi一樣。

一個(gè)可能的輸出:

{ target_defaults:
   { cflags: [],
     default_configuration: 'Release',
     defines: [],
     include_dirs: [],
     libraries: [] },
  variables:
   { host_arch: 'x64',
     node_install_npm: 'true',
     node_prefix: '',
     node_shared_cares: 'false',
     node_shared_http_parser: 'false',
     node_shared_libuv: 'false',
     node_shared_zlib: 'false',
     node_use_dtrace: 'false',
     node_use_openssl: 'true',
     node_shared_openssl: 'false',
     strict_aliasing: 'true',
     target_arch: 'x64',
     v8_use_snapshot: 'true' } }

process.kill(pid[, signal])

給進(jìn)程傳遞一個(gè)信號(hào)。pid是進(jìn)程id,signal是描述信號(hào)的字符串。信號(hào)碼類似于'SIGINT''SIGHUP'。如果忽略,那么信號(hào)將是'SIGTERM'。更多信息參閱Signal Eventskill(2)。

如果目標(biāo)不存在將會(huì)拋出一個(gè)錯(cuò)誤,并且在一些情況下,0信號(hào)可以被用來測試進(jìn)程的存在。

注意,這個(gè)函數(shù)僅僅是名字為process.kill,它只是一個(gè)信號(hào)發(fā)送者。發(fā)送的信號(hào)可能與殺死進(jìn)程無關(guān)。

一個(gè)發(fā)送信號(hào)給自身的例子:

process.on('SIGHUP', function() {
  console.log('Got SIGHUP signal.');
});

setTimeout(function() {
  console.log('Exiting.');
  process.exit(0);
}, 100);

process.kill(process.pid, 'SIGHUP');

注意:當(dāng)SIGUSR1io.js收到,它會(huì)開始調(diào)試。參閱Signal Events。

process.pid#

進(jìn)程的PID。

console.log('This process is pid ' + process.pid);

process.title#

設(shè)置/獲取 'ps' 中顯示的進(jìn)程名。

當(dāng)設(shè)置該屬性時(shí),所能設(shè)置的字符串最大長度視具體平臺(tái)而定,如果超過的話會(huì)自動(dòng)截?cái)唷?/p>

在 Linux 和 OS X 上,它受限于名稱的字節(jié)長度加上命令行參數(shù)的長度,因?yàn)樗懈采w參數(shù)內(nèi)存。

v0.8 版本允許更長的進(jìn)程標(biāo)題字符串,也支持覆蓋環(huán)境內(nèi)存,但是存在潛在的不安全和混亂。

process.arch

返回當(dāng)前的處理器結(jié)構(gòu):'arm''ia32''x64'。

console.log('This processor architecture is ' + process.arch);

process.platform

放回當(dāng)前的平臺(tái):'darwin','freebsd''linux','sunos''win32'

console.log('This platform is ' + process.platform);

process.memoryUsage()

返回當(dāng)前io.js進(jìn)程內(nèi)存使用情況(用字節(jié)描述)的對象。

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

可能的輸出:

{ rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472 }

heapTotalheapUsed指向V8的內(nèi)存使用。

process.nextTick(callback[, arg][, ...])

  • callback Function

在事件循環(huán)的下一次循環(huán)中調(diào)用回調(diào)函數(shù)。

這不是setTimeout(fn, 0)的簡單別名,它更有效率。在之后的tick中,它在任何其他的I/O事件(包括timer)觸發(fā)之前運(yùn)行。

console.log('start');
process.nextTick(function() {
  console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callback

這對于開發(fā)你想要給予用戶在對象被構(gòu)建后,任何I/O發(fā)生前,去設(shè)置事件監(jiān)聽器的機(jī)會(huì)時(shí),非常有用。

function MyThing(options) {
  this.setupOptions(options);

  process.nextTick(function() {
    this.startDoingStuff();
  }.bind(this));
}

var thing = new MyThing();
thing.getReadyForStuff();
// thing.startDoingStuff() gets called now, not before.

這對于100%同步或100%異步的API非常重要??紤]一下例子:

// WARNING!  DO NOT USE!  BAD UNSAFE HAZARD!
function maybeSync(arg, cb) {
  if (arg) {
    cb();
    return;
  }

  fs.stat('file', cb);
}

這個(gè)API是危險(xiǎn)的,如果你這樣做:

maybeSync(true, function() {
  foo();
});
bar();

foo()bar()的調(diào)用次序是不確定的。

更好的做法是:

function definitelyAsync(arg, cb) {
  if (arg) {
    process.nextTick(cb);
    return;
  }

  fs.stat('file', cb);
}

注意:nextTick隊(duì)列在每一次事件循環(huán)的I/O開始前都要完全執(zhí)行完畢。所以,遞歸地設(shè)置nextTick回調(diào)會(huì)阻塞I/O的方法,就像一個(gè)while(true);循環(huán)。

process.umask([mask])

設(shè)置或讀取進(jìn)程的文件模式的創(chuàng)建掩碼。子進(jìn)程從父進(jìn)程中繼承這個(gè)掩碼。返回舊的掩碼如果mask參數(shù)被指定。否則,會(huì)返回當(dāng)前掩碼。

var oldmask, newmask = 0022;

oldmask = process.umask(newmask);
console.log('Changed umask from: ' + oldmask.toString(8) +
            ' to ' + newmask.toString(8));

process.uptime()

io.js進(jìn)程已執(zhí)行的秒數(shù)。

process.hrtime()

[seconds, nanoseconds]元組數(shù)組的形式返回高分辨時(shí)間。是相對于過去的任意時(shí)間。它與日期無關(guān)所以不用考慮時(shí)區(qū)等因素。它的主要用途是衡量程序性能。

你可以將之前的process.hrtime()返回傳遞給一個(gè)新的process.hrtime()來獲得一個(gè)比較。衡量性能時(shí)非常有用:

var time = process.hrtime();
// [ 1800216, 25 ]

setTimeout(function() {
  var diff = process.hrtime(time);
  // [ 1, 552 ]

  console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]);
  // benchmark took 1000000527 nanoseconds
}, 1000);

process.mainModule

檢索require.main的備用方式。區(qū)別是,如果主模塊在運(yùn)行時(shí)改變,require.main可能仍指向改變發(fā)生前的被引入的原主模塊。通常,假設(shè)它們一樣是安全的。

require.main一樣,當(dāng)如果沒有入口腳本時(shí),它將是undefined。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)