這裡介紹如何使用 Node.js 來開發 Linux 系統用的工具程式,並且提供各種範例程式讓初學者參考。
Node.js 除了最為網頁伺服器之外,也可以用來開發系統用的小工具程式,比起使用傳統的 Bash 語法,JavaScript 應該會讓一般人更容易上手,而且執行效能也很不錯,尤其在牽涉到大量的 I/O 的時候,更能凸顯 Node.js 非同步的效能優勢。
Hello World
首先來看一下使用 Node.js 的 Hello World 程式:
#!/usr/bin/env node
console.log('Hello, World.');
第一行是以 env 來指定直譯器的位置,而第二行是輸出字串到螢幕上。
我們將這個程式儲存成 hello 這個檔案,而要讓它可以正常在 Linux 中執行,記得要開啟執行權限:
chmod +x hello
接著就可以執行它了:
./hello
輸出為:
Hello, World.
命令列參數
一般的指令通常都會附帶一些參數讓使用者設定各種選項,在 Node.js 的環境中,我們可以從 process.argv 這個變數取得從命令列所傳入的參數,我們可以寫一小程式來實際看一下這個變數的值:
#!/usr/bin/env node
console.log(process.argv);
架設我們將這個程式儲存為 demo1,設定好執行權限後,接著執行:
./demo1 --gtwang -a -b
輸出為
[ '/usr/local/bin/node', '/Users/seal/tmp/demo1', '--gtwang', '-a', '-b' ]
process.argv 的第一個元素是 node 執行檔的位置,而第二個則是目前執行的指令稿位置,第三個之後就是命令列所指定的參數,如果只需要參數的資料,可以用 slice 將前兩個沒有用的元素去掉:
var args = process.argv.slice(2);
這樣 args 就只會包含單純參數的部分。
程式傳回值
在開發 UNIX/Linux 系統的程式時,應該同時要注意程式離開時的傳回值,標準的指令在執行成功時會傳回 0,如果出現錯誤,則會傳回非 0 的值,而在 Node.js 的環境中,在程式結束的時候,我們可以用這樣的方式回傳指定的數值:
if (error) {
// 如果出現錯誤
process.exit(1);
} else {
// 如果正常結束
process.exit(0);
}
輸入、輸出與管線
管線(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 訊號,輸出訊息後就會離開。
