輸入、輸出與管線

管線(pipe)是 UNIX/Linux 系統很重要的功能之一,它可以將不同程式的輸出與輸入串接起來,組合成各式各樣的應用,雖然概念上很簡單,但只要運用得當,它的功能是非常強大的。例如要從 ps 的輸出中找尋 node 這個字眼,我們可以利用管線將 ps 的輸出導引至 grep 的輸入,利用 grep 搜尋這個字串:

ps aux | grep 'node'

如果想要讓自己開發的 Node.js 程式也具備從標準輸入讀入資料的功能,可以這樣寫:

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(data) {
  process.stdout.write(data);
});

這樣的話,我們就可以使用管線把資料導入自己寫的 Node.js 程式中了(假設我們自己寫的指令稿為 pipe.js):

echo 'hello, gtwang.' | node pipe.js

輸出為

hello, gtwang.

UNIX 訊號

Node.js 也同時支援 UNIX 的訊號(signal),我們可以設計讓程式接收特定的訊號,並執行對應的動作,下面這個範例程式會在收到 SIGINT 信號時,輸出一行訊息,並且離開:

process.stdin.resume();

process.on('SIGINT', function () {
  console.log('Got a SIGINT. Goodbye!');
  process.exit(0);
});

將這段指令稿儲存為 signal.js,並執行它:

node signal.js

如果要傳送 SIGINT 訊號給這個程式,最直接的方式就是按下鍵盤的 Ctrl + c,程式接收到 SIGINT 訊號之後,就會輸出訊息並離開:

^CGot a SIGINT. Goodbye cruel world

另外我們也可以透過 kill 指令來將訊號送給指定的行程,不過首先要先查詢該程式的行程 ID:

ps aux | grep signal.js

輸出會像這樣:

gtwang    2024  0.7  1.0 640840 21624 pts/1    Sl+  10:27   0:00 node signal.js
gtwang    2057  0.0  0.1  13712  2204 pts/4    S+   10:27   0:00 grep --color=auto signal.js

從這個輸出中可以看出 node signal.js 這個行程的 ID 是 2024,接著用 kill 送一個 SIGINT 訊號給這個程式:

kill -s SIGINT 2024

這樣 node signal.js 就會收到 SIGINT 訊號,輸出訊息後就會離開。

參考資料:George Ornbo