分類: Linux

Node.js 開發命令列程式,用 JavaScript 撰寫 Linux 系統用的指令稿

輸入、輸出與管線

管線(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

Page: 1 2

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang
標籤: Node.js

Recent Posts

[DIY] 自製凡士林火種

這裡介紹如何利用簡單的凡士林與...

2 年 ago

[DIY] 自製火影木葉、砂忍者村標誌雕刻木牌

本篇記錄我用路邊撿來的樟木與龍...

2 年 ago

收集龍眼木修剪枝幹用於木頭工藝

最近打算帶著阿玄做一些木工作品...

2 年 ago

[DIY] 樟木手工自製迷你手裏劍(忍者武器)

本篇記錄阿玄第一次使用木工工具...

2 年 ago

[DIY] 龍眼木手工自製木槌

本篇記錄我用自己砍的龍眼木還有...

2 年 ago

[DIY] 樟木手工自製苦無(忍者武器)

本篇記錄我自己用樟木的枝幹,以...

2 年 ago