Tag: stdio

当在node.js中的subprocess中使用vim时,stdio /pipe道问题

我正在使用node.js编写一个命令行界面来生成unit testing文件。 我一直在使用查询器获取用户input,但是有一个字段,用户很可能希望复制粘贴和/或编辑JSON数据的大型多行块。 因此,我的目标是:在CLI中打开vim @某个点 – >允许input – >closuresvim – >写出tmp文件 – >处理结果。 问题是vim的input也会转到父标准input,当返回键被input时,程序继续在vim(混乱)之上。 我很确定stdio / in / out / err没有正确设置,但我似乎无法find确切的解决scheme。 我操纵stream的每一次迭代似乎更接近,但是我知道有一个小的缺失的连接。 我已经尝试了很多东西: var vim = child_process.spawn('vim', [path], {stdin: 'pipe', stdout: 'pipe', stderr: 'pipe'}); var vim = child_process.spawn('vim', [path], {stdio: 'inherit'}); //{stdio: ['pipe','pipe','pipe']} 最后,我从这个例子中跟踪了很多stdio操作, 我如何从node.js打开一个terminal应用程序? ,但仍然有一些小的缺失的链接,我需要帮助 笔记: 我99%确定我的asynchronous承诺是有序的。 它不一定是vim,因为我正在首先检查编辑器的ENV 我把它比作git commit,在编辑器popup并允许input之前closures 在一个小的testing程序中,我可以得到完美的function,但是当试图通过另一个过程来做到这一点时,它不会很好 tl; dr:我想忽略父进程而input只去vim(child_process),但我不能让他们分开,正因为如此,程序去haywire 如果有什么我可以澄清,请让我知道。 […]

child_processstream反压

我正在使用exec-stream和Node.js,通过一些其他转换stream传输stream,最终通过node-brakestream来限制数据速率。 制动stream似乎没有效果,事实上数据最终在长链末端丢失。 execStream('some-external-binary').pipe(transform1).pipe(transform2).pipe(brake(1024)) 我认为发生的事情是, child_process STDOUTstream(在exec-stream )没有暂停,因此缓冲区填满,直到数据丢失。 做child_processstream的行为是这样吗? 有什么办法让背压能够正确使用child_processstream?

只将stdoutredirect到/ dev / null

我还没有掌握奇怪的shell stdioredirect的东西呢。 我想运行npm install但redirectstdout,所以我不必看到所有这一切。 (我还想在terminal捕捉stderr,我只是不想看到stdout)。 npm install -D suman 1> /dev/null 这似乎并不奏效。 什么是正确的语法(可能,为什么)用于只redirect到/dev/null stdout?

转换stream以将string前置到每一行

我像这样产生了一个subprocess: const n = cp.spawn('bash'); n.stdout.pipe(process.stdout); n.stderr.pipe(process.stderr); 我正在寻找一个转换stream,以便我可以在孩子的每一行的开始处添加像[[child process]]之类的东西,所以我知道stdio是从父subprocess发出的。 所以它看起来像: const getTransformPrepender = function() : Transform { return … } n.stdout.pipe(getTransformPrepender('[child]')).pipe(process.stdout); n.stderr.pipe(getTransformPrepender('[child]')).pipe(process.stderr); 有没有人知道是否有这样的现有变换包或如何写一个? 我有这个: import * as stream from 'stream'; export default function(pre: string){ let saved = ''; return new stream.Transform({ transform(chunk, encoding, cb) { cb(null, String(pre) + String(chunk)); }, flush(cb) { this.push(saved); cb(); } […]

通过nodejs重新附加到产生的进程

我正在Node.js中创build一个小型私有游戏服务器pipe理器; 目前它通过child_process产生游戏来运行游戏: var server = spawn(cmd, args, { cwd: 'something' }); 只要经理继续跑,我可以pipe命令,并按我的意愿处理孩子。 但是,考虑我的经理崩溃或closures的可能性。 那么我将如何重新连接到之前产生的subprocess(在经理closures时仍然在运行)呢? 我可以存储pidfiles来尝试重新连接基于pid; 但我不知道如何获得一个child_process对象访问子的stdio对象。 我真的希望这可以恢复; 任何帮助表示赞赏,谢谢! 请注意 :游戏服务器是专有的,一些例子是Minecraft,Source DS等。假设我没有访问服务器源。 编辑 从节点的child_process读取一些源代码后,看起来像是在stdinStream , stdoutStream或stderrStream选项中指定了一个属性,它应该只是打开一个套接字。 (见428-496行)。 所以问题是,我怎么停止产卵实际上做一个产卵,而只是设置基于指定的PID和我传递的stream的值。 (我会通过做fs.createWriteStream('/proc/PID/fd/0');得到我的stdinStream fs.createWriteStream('/proc/PID/fd/0');这应该工作,因为该fd被创build为一个pipe道。