process 進(jìn)程

2018-07-11 09:37 更新

process 對(duì)象是一個(gè)全局對(duì)象,可以在任何地方訪問。它也是一個(gè)EventEmitter 的實(shí)例。

Event: 'exit'

function () {}

此事件在進(jìn)程退出時(shí)被觸發(fā)。這是一個(gè)檢查模塊狀態(tài)的好地方(例如,做單元測(cè)試)。由于主事件循環(huán)在'exit' 返回方法之后將不會(huì)繼續(xù)執(zhí)行,所以計(jì)時(shí)器(timers)可能不會(huì)生效。

示例,監(jiān)聽exit 事件:

process.on('exit', function () {
process.nextTick(function () {
console.log('This will not run');
});
console.log('About to exit.');
});

Event: 'uncaughtException'

function (err) { }

發(fā)生未處理的異常時(shí),此事件會(huì)被觸發(fā)。如果該事件有監(jiān)聽函數(shù),則不執(zhí)行默認(rèn)行為(默認(rèn)行為將打印錯(cuò)誤堆 棧并結(jié)束應(yīng)用程序的執(zhí)行)。 示例,監(jiān)聽'uncaughtException'事件:

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 事件是一種非常原始的異常處理機(jī)制。你可以在程序中使用try/cache 來獲得對(duì)程序流 的更多控制權(quán)。特別是對(duì)于要長(zhǎng)時(shí)間執(zhí)行的服務(wù)器端程序,uncaughtException 事件是個(gè)很有用的安全機(jī)制。

Signal Events

function () {}

當(dāng)進(jìn)程接收到信號(hào)時(shí)被觸發(fā)。要查看如SIGINT 或SIGUSR1之類的標(biāo)準(zhǔn)POSIX 信號(hào)列表,請(qǐng)參看參看 sigaction(2)。

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

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

發(fā)送SIGIINT 信號(hào)最簡(jiǎn)單的方法是使用Control-C,大多數(shù)情況下這會(huì)終止應(yīng)用程序的執(zhí)行。

process.stdout

一個(gè)代表標(biāo)準(zhǔn)輸出的流對(duì)象。

示例:console.log 的定義

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

process.openStdin()

打開標(biāo)準(zhǔn)輸入流,返回一個(gè)只讀流對(duì)象。 打開標(biāo)準(zhǔn)輸入并同時(shí)監(jiān)聽兩個(gè)事件的示例:

var stdin = process.openStdin();
stdin.setEncoding('utf8');
stdin.on('data', function (chunk) {
process.stdout.write('data: ' + chunk);
});
stdin.on('end', function () {
process.stdout.write('end');
});

process.argv

保存命令行參數(shù)的數(shù)組。第一個(gè)參數(shù)是"node",第二個(gè)參數(shù)是Javascript 文件的文件名,接下來是附加的命令 行參數(shù)。

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

上述代碼將產(chǎn)生如下輸出:

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

process.execPath

此參數(shù)為進(jìn)程可執(zhí)行文件的絕對(duì)路徑。

例如:

/usr/local/bin/node

process.chdir(directory)

改變進(jìn)程的當(dāng)前目錄,失敗時(shí)拋出異常。

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

process.compile(code, filename)

同evel 方法相同,但是你可以指定文件名,這樣可以更好的輸出錯(cuò)誤信息,并且運(yùn)行的代碼(指通過code 參數(shù) 傳遞的代碼)無法訪問本地作用域。如果編譯的代碼產(chǎn)生堆棧輸出,filename 參數(shù)將會(huì)被用作這段代碼的文件名。 示例,使用process.compile 和eval 執(zhí)行同一段代碼:

var localVar = 123,
compiled, evaled;
compiled = process.compile('localVar = 1;', 'myfile.js');
console.log('localVar: ' + localVar + ', compiled: ' + compiled);
evaled = eval('localVar = 1;');
console.log('localVar: ' + localVar + ', evaled: ' + evaled);
// localVar: 123, compiled: 1
// localVar: 1, evaled: 1

process.compile 并沒有訪問本地作用域,所以localVar 變量并沒有改變。eval 可以訪問本地作用域,所以localVar 被改變了。

當(dāng)代碼中有語(yǔ)法錯(cuò)誤時(shí),process.compile 將會(huì)是應(yīng)用程序退出。

參見:腳本(Script)章節(jié)

process.cwd()

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

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

process.env

一個(gè)保存用戶環(huán)境變量的對(duì)象。參看environ(7)。

process.exit(code=0)

使用進(jìn)程退出代碼(main 函數(shù)的返回值)并退出進(jìn)程。如果不指定參數(shù),exit 將使用表示成功的代碼0。 示例,退出程序,并返回錯(cuò)誤狀態(tài)。

process.exit(1);

執(zhí)行node 的shell 將會(huì)得到返回值1。

process.getgid()

返回進(jìn)程的用戶組標(biāo)識(shí)。(參見getgid(2).)這個(gè)是數(shù)字形式的組ID,并非組名。

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

process.setgid(id)

當(dāng)前進(jìn)程的用戶組標(biāo)識(shí)。(參見setgid(2).)這個(gè)函數(shù)可以接受數(shù)字形式的組ID 或者是字符串形式的組名。如果 指定組名,此函數(shù)會(huì)阻塞進(jìn)程直至將組名解析成為數(shù)字ID。

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.getuid()

返回當(dāng)前進(jìn)程的用戶標(biāo)識(shí)。(參看getuid(2).)此函數(shù)返回?cái)?shù)字形式的用戶ID,而不是用戶名。

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

process.setuid(id)

指定當(dāng)前進(jìn)程的用戶標(biāo)識(shí)。(參看setuid(2).)這個(gè)函數(shù)可以接受數(shù)字形式的用戶ID 或者字符串形式的用戶名。 如果指定用戶名,此方法在將用戶名解析成用戶ID 時(shí)會(huì)阻塞。

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.version

編譯進(jìn)可執(zhí)行文件的屬性,代表NODE_VERSION。

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

process.installPrefix

編譯進(jìn)可執(zhí)行文件的屬性,代表NODE_PREFIX。

console.log('Prefix: ' + process.installPrefix);

process.kill(pid, signal='SIGINT')

向一個(gè)進(jìn)程發(fā)送信號(hào),參數(shù)pid 為進(jìn)程ID,signal 是一個(gè)描述要發(fā)送信號(hào)的字符串,如‘SIGINT’或者‘SIGUSR1’。 如果不指定,默認(rèn)發(fā)送'SIGINT'信號(hào)。更多信息請(qǐng)參看kill(2)。

請(qǐng)注意,雖然此函數(shù)名為process.kill,但是它僅僅用于發(fā)送信號(hào),就像kill 系統(tǒng)調(diào)用。發(fā)送的信號(hào)做除了結(jié)束 目標(biāo)進(jìn)程外,還可能做其他的事情。 發(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');

process.pid

當(dāng)前進(jìn)程的ID

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

process.title

設(shè)置、獲取ps 命令中顯示的名稱。

process.platform

表示程序運(yùn)行的平臺(tái),如'linux2','darwin'等。

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

process.memoryUsage()

返回一個(gè)描述Node 進(jìn)程內(nèi)存占用的對(duì)象。

var sys = require('sys');
console.log(sys.inspect(process.memoryUsage()));

如上代碼將輸出:

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

heapTotal 和heapUsed 表示V8占用的內(nèi)存。

process.nextTick(callback)

在事件循環(huán)的下一輪調(diào)用這個(gè)回調(diào)。此函數(shù)不是setTimeout(fn, 0)的別名,它更加高效。

process.nextTick(function () {
console.log('nextTick callback');
});

process.umask([mask])

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

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


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)