[Node.js] 使用 Process 模組

Process 模組是 Node.js 提供的一個全域物件,可以在任何位置直接存取該物件,該物件包含了程式中所佔用的全部系統資源,例如:CPU、I/O、記憶體、環境變數等。因此,對 Process 進行有效的管理是很重要的。

取得應用程式目前的所在目錄、改變應用程式目前所在的目錄

console.log('目前的所在目錄位置:' + process.cwd());
console.log('更改目錄位置到: /Users/carlos');
process.chdir('/Users/carlos');
console.log('目前的所在目錄位置:' + process.cwd());

// 輸出以下內容:
目前的所在目錄位置:/Users/carlos/Documents/test
更改目錄位置到: /Users/carlos
目前的所在目錄位置:/Users/carlos

取得系統相關資訊

// 輸出處理程序 PID
console.log(process.pid);

// 輸出處理程序名稱(此例為 node)
console.log(process.title);

// 輸出 node 的版本號(此例為 v6.11.2)
console.log(process.version);

// 輸出 node 的版本相關屬性
console.log(process.versions);
{ http_parser: '2.7.0',
  node: '6.11.2',
  v8: '5.1.281.103',
  uv: '1.11.0',
  zlib: '1.2.11',
  ares: '1.10.1-DEV',
  icu: '58.2',
  modules: '48',
  openssl: '1.0.2l' }

// 輸出 node 的系統組態相關設定
console.log(process.config);

// 輸出執行現在處理程序可執行檔的絕對路徑
console.log(process.execPath);
// /usr/local/bin/node

// 輸出現在處理程序的命令列參數陣列
console.log(process.argv);
[ '/usr/local/bin/node',
  '/Users/carlos/Documents/test/buffer-define.js' ]

// 輸出現在系統平台(此例為 darwin)
console.log(process.platform);

// 輸出現在 CPU 架構(此例為 X64)
console.log(process.arch);

// 輸出系統環境變數
console.log(process.env);

process 的標準輸出串流

process.stdout.write('output\n');
// 會輸出 output 文字並斷行。與 console.log() 是相同的,因為 console.log()
 就是封裝了 process.stdout.write() 方法後實作的結果。

process 的標準錯誤串流

var fs = require('fs');
var file = 'err.txt';
var encoding = 'UTF-8';

fs.readFile(file, encoding, function(err, data){
  if(err){
    process.stderr.write('err: ' + err + '\n');
  } else {
    console.log(data);
  }
});

// 若檔案不存在的話,就會輸出以下:
err: Error: ENOENT: no such file or directory, open 'err.txt'

process 的標準輸入串流

// 接受 console 輸入
process.stdin.setEncoding('utf8');
process.stdin.on('readable', function(){
  var chunk = process.stdin.read();
  if(chunk !== null){
    process.stdout.write('Print Data: ' + chunk + '\n');
  }
});

// 按下「Ctrl + d」後,結束 console
process.stdin.on('end', function(){
  process.stdout.write('end.\n');
});

輸出的測試結果如下:

如何 kill 處理程序

console.log('目前 process id:' + process.pid);
process.on('SIGHUP', function(){ // 用於終止控制台 Node 處理程序
  console.log('Got SIGHUP signal.');
});

setTimeout(function(){
  console.log('Exiting...');
  process.exit(0); // 這行才會真正的終止目前的 process
  console.info('已退出 process id:' + process.pid); // 此行並不會輸出,因為該 process 已結束。
}, 1000);

process.kill(process.pid, 'SIGHUP'); // 這並不會結束 process,只是發出 SIGHUP 訊號。
console.info('正在結束 process id:' + process.pid);

輸出結果如圖:

Process 模組的非同步方法:process.nextTick()

可以使用 process.nextTick() 方法來取代 setTimeout() 方法,因為效率較高。

console.time('startB'); // 計時器 startB 開始計時
console.log('start - setTimeout');
setTimeout(function(){ // setTimeout() 的非同步作業
  console.log('nextTick callback 2');
}, 0);
console.log('scheduled - setTimeout');
console.timeEnd('startB'); // 計時器 startB 結束計時

console.time('startA'); // 計時器 startA 開始計時
console.log('start - nextTick');
process.nextTick(function(){ // process.nextTick() 的非同步作業
  console.log('nextTick callback 1');
});
console.log('scheduled - nextTick');
console.timeEnd('startA'); // 計時器 startA 結束計時
console.info('== Process nextTick ==');

輸出結果如下圖,可以得知 process.nextTick() 效率很高,幾乎無阻塞,所以「nextTick callback 1」反而先被輸出。

您可在此處留言

avatar

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料

  Subscribe  
Notify of