[英]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你告訴操作系統啟動進程ps
, ps
不需要等待運行,直到輸出可以通過管道傳輸到任何地方但可以在此之前啟動,它可能只會在嘗試寫入其輸出時被迫等待流。 然后是你的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.