簡體   English   中英

ps au |的結果 在Node.js中使用grep ssh(使用spawn / pipe)與shell不同

[英]Result of ps au | grep ssh different in Node.js (using spawn/pipe) vs shell

我正在玩節點流和子進程。 所以我想用管道模擬下一個shell命令:

ps au | grep ssh

所以我寫了下一個代碼:

var spawn = require('child_process').spawn;
var ps    = spawn('ps',   ['au']);
var grep  = spawn('grep', ['ssh']);

ps.stdout.pipe(grep.stdin);

grep.stdout.on('data', function(data) { console.log(data) });

然后我運行它,但沒有任何反應。 我做錯了什么?

PS - 我知道:

require('child_process')
   .exec('ps au | grep ssh', function(err, stdout, stderr) { 
       ... 
   }). 

我只是在玩Node.js,我想知道這個例子有什么問題。

更新1:
似乎grep bash程序按預期工作,但是使用grep ssh沒有結果。 雖然ps au | grep ssh ps au | grep ssh給了我這個結果:

vagrant 11681 0.0 0.1 10464 916 pts/0 S+ 07:54 0:00 grep --color=auto ssh.

當您調用ps ,它將列出與傳遞的選項匹配的所有當前正在運行的進程。 哪個可能會尋找ps au這樣的東西:

tniese  3251   0,0  0,0  2479028   3004 s000  S+    4:06am   0:00.03 -bash
root    4453   0,0  0,0  2452408    876 s004  R+    4:06pm   0:00.00 ps au

當你打電話給ps au | grep ssh shell grep中的ps au | grep ssh將過濾該結果,僅顯示包含ssh的行。

如果在ps創建其列表之前由shell啟動grep那么過濾之前的輸出將是:

tniese  3251   0,0  0,0  2479028   3004 s000  S+    4:06am   0:00.03 -bash
root    4453   0,0  0,0  2452408    876 s004  R+    4:06pm   0:00.00 ps au
tniese  4478   0,0  0,0  2441988    596 s000  R+    4:06pm   0:00.00 grep ssh

grep進程將匹配其自己的條目,因為它包含傳遞的參數,因此篩選的結果將是:

tniese  4478   0,0  0,0  2441988    596 s000  R+    4:06pm   0:00.00 grep ssh

讓我們看看你的代碼發生了什么:

var spawn = require('child_process').spawn;
var ps    = spawn('ps',   ['au']);
var grep  = spawn('grep', ['ssh']);

ps.stdout.pipe(grep.stdin);

使用spawn你告訴操作系統啟動進程psps不需要等待運行,直到輸出可以通過管道傳輸到任何地方但可以在此之前啟動,它可能只會在嘗試寫入其輸出時被迫等待流。 然后是你的spawn grep ,但是當grep被啟動時, ps可能已經在內部創建了進程列表,並且導致它不包含grep進程。 然后ps的輸出傳遞給grep。 但由於此輸出缺少grep ssh ,因此不會顯示該行。

Wether grep將出現在您的列表中,或者不依賴於OS。 一般來說,如果列出或不列出,你應該假設它是隨機的。 或者您需要等到ps退出並在此之后啟動grep

您需要始終牢記當前操作系統具有搶占式多任務處理,並且調度程序可能在spawn('ps', ['au']);后立即暫停節點spawn('ps', ['au']); 並在ps創建/請求列表后立即繼續該過程。

我希望這個解釋比我的評論更清楚一點。

我在ps之前產生了grep,現在效果很好。 我認為這一定是一個時間問題。 試試這個。

var spawn = require('child_process').spawn;
var grep  = spawn('grep', ['ssh']);
var ps    = spawn('ps',   ['au']);

ps.stdout.pipe(grep.stdin);

grep.stdout.on('data', function(data) { 
  console.log(data.toString("utf8")); 
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM