2014-12-02 63 views
1

继承人什么我做了主旨暂停:https://gist.github.com/MattCollins84/75f9ebd422ed6d1d5c91用Node.js的“重生”运行bash脚本似乎中途执行

由于一些过程的一部分,我产生了一堆的bash脚本卷曲命令(大约20k个命令)。我想通过节点运行这个脚本。

我正在使用spawn来做到这一点,它工作正常。除了70多个命令之后,它就停止了。由spawn创建的readstream停止输出任何数据。根据我的观察,没有任何错误或任何事情。

如果我通过“ps x | grep curl”来查看发生了什么,我可以看到进程ID刚开始发生变化,但它似乎在某个时刻停止运行,从此不再启动。这个过程只是挂起。手动杀死这个过程不会让下一个开始。此外,与我的bash脚本相关的过程仍然存在,再次,杀死没有任何区别。

意见和事情我已经排除了:

  • 使用最少的资源
  • 在终端上运行生成的bash脚本工作正常
  • 似乎并不重要,我蜷缩其URL(也就是说,它不是我的 应用程序)

我觉得有一些愚蠢的我失踪,但我不知道该怎么向谷歌数字出来!

我只是希望运行这个文件,就好像我在终端上一样,但是Node出现了某种限制来阻止它失控。或者其他的东西。

有什么想法? 谢谢

+0

有趣的是,如果我稍微修改我的脚本是: '变种卷曲=产卵( '/用户/ mcollins /桌面/ generated.sh',[],{标准输入输出: '继承'});' 即添加stdio选项 - 它的工作原理! 不知道为什么tho,据我所见,这只是将stdin/out子进程重定向回节点进程? – mattCI 2014-12-02 10:11:50

回答

1

由于mattCi在他的comment中指出,{ stdio: 'inherit' }解决了它。

2

尽管我不熟悉Node的spawn函数,但我对Unix管道很熟悉。这听起来像在你的第一个场景中,你运行的程序产生了输出,但是你的程序没有读取那个输出。当管道缓冲区已满时,您执行的程序将阻止尝试写入该程序。当你的程序从管道读取时,它将被解除封锁。

您找到的解决方案(stdio: 'inherit')可能会告诉函数使用相同的stdout,stderr和stdin流运行子进程。因此,您的程序不需要从管道读取数据,因为它不是管道。您执行的程序然后写入终端,该终端读取输出,因此它不会阻止。