2013-07-03 55 views
0

讓我們來看看顯示系統信息並定期更新它的「頂級」應用程序。使用node.js讀取應用程序標準輸出數據

我想使用node.js運行它並顯示該信息(和更新!)。 代碼我想出了:

#!/usr/bin/env node 

var spawn = require('child_process').spawn; 

var top = spawn('top', []); 

top.stdout.on('readable', function() { 
    console.log("readable"); 
    console.log('stdout: '+top.stdout.read()); 
}); 

它不表現我預期的方式。實際上它什麼都不會產生:

readable 
stdout: null 
readable 
stdout: 
readable 
stdout: null 

然後退出(這也是意外)。

僅以頂部應用爲例。目標是通過節點代理這些更新並將它們顯示在屏幕上(與從命令行直接運行頂層的方式相同)。

我最初的目標是編寫使用scp發送文件的腳本。做到這一點,然後注意到我缺少scp自身顯示的進度信息。看了看scp節點模塊,他們也沒有代理它。所以回溯到頂級的常見應用程序。

回答

2

top是一款交互式控制檯程序,設計用於在真實的僞終端上運行。

對於您的stdout讀取,top看到它的stdin不是tty並退出並出現錯誤,因此stdout上沒有輸出。你可以看到這發生在shell中,如果你這樣做echo | top它會退出,因爲stdin不會是一個tty。

即使它實際上正在運行,它的輸出數據將包含用於操作固定維度控制檯的控制字符。 (如「將光標移動到第2行的開頭」)。這是一個交互式用戶界面,作爲程序化數據源是一個糟糕的選擇。 「屏幕抓取」和解釋這些數據並提取有意義的信息將是相當困難和脆弱的。你是否考慮過一種更清潔的方法,例如從/proc/meminfo文件中獲取所需的數據以及內核爲此目的公開的其他特殊文件?最終,top從即時可用的特殊文件和系統調用中獲取所有這些數據,因此您應該能夠利用便於編程訪問的數據源,而不是嘗試篩選頂層。

當然,top有分析代碼來執行平均值等等,您可能不得不重新實現,因此屏幕抓取和通過乾淨的數據源都有優點和缺點,以及方便且困難的方面。但是,我的0.02美元將專注於良好的數據源,而不是試圖屏蔽一個控制檯UI。

其他選項/資源來考慮:

只需要清楚,是的,它肯定可以運行top作爲子進程,欺騙它認爲有一個tty和所有相關的環境設置,並獲取它正在寫入的數據。這非常複雜,類似於通過在電視屏幕上拍攝天氣頻道的照片並在其上運行光學字符識別來獲取天氣。風格點,但有更簡單的方法。如果您需要研究更多關於欺騙控制檯程序作爲子進程運行的信息,請查看expect命令。

+0

頂部只是一個例子。還有其他應用程序顯示執行進度等。我想通過節點將數據代理到屏幕或文件(如果可能的話)。 –

+0

已更新,說明頂部正在退出,因爲stdin不是tty。 –

+0

彼得,以及頂級或類似的應用程序如何顯示他們的數據,他們確實不推動它作爲標準輸出? –

相關問題