輸入、輸出與管線
管線(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
繼續閱讀: 12