你打电话时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
在壳里grep
将过滤该结果以仅显示包含以下内容的行ssh
.
If the grep
之前由 shell 启动ps
创建其列表,然后过滤前的输出将是:
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
The 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
不需要等到输出可以通过管道传输到任何地方才运行,但可以在此之前启动,它可能只在尝试写入其输出流时被迫等待。然后你的产卵grep
,但当时grep
已推出ps
可能已经在内部创建了进程列表,原因是它不包含grep
过程。的输出ps
然后传递给 grep。但由于缺少此输出grep ssh
它不会显示那条线。
Wether grep
是否出现在您的列表中很大程度上取决于操作系统。一般来说,无论是否列出,您都应该假设它是随机的。或者你需要等到ps
退出并启动grep
在那之后。
您需要始终记住,当前操作系统具有抢占式多任务处理,并且调度程序可能会在之后立即暂停节点spawn('ps', ['au']);
并立即继续该过程ps
创建/请求列表。
我希望这个解释比我的评论更清楚一些。