使用" spawn"运行bash脚本在Node.js似乎暂停执行中途

时间:2014-12-02 09:07:07

标签: node.js bash curl spawn spawning

这是我正在做的事情的主旨:https://gist.github.com/MattCollins84/75f9ebd422ed6d1d5c91

作为某个过程的一部分,我生成一个bash脚本,其中包含一堆curl命令(大约20k命令)。我想通过节点运行这个脚本。

我正在使用spawn来做到这一点,它工作正常。除了在70左右的命令后,它才会停止。由spawn创建的读取流停止输出任何数据。就我所见,没有任何错误或任何错误。

如果我执行“ps x | grep curl”来查看正在发生的事情,我可以看到进程id最初正在改变,但它似乎只是在某一点停止并且永远不会再次启动。这个过程刚刚挂起。手动杀死此进程不会让下一个进程开始。此外,与我的bash脚本相关的过程仍然存在,再次,杀死没有任何区别。

观察和我排除的事情:

  • 使用最少的资源
  • 在终端上运行生成的bash脚本正常
  • 似乎无关紧要我正在卷曲的网址(即它不是我的 应用程序)

我觉得我遗失了一些愚蠢的东西,但我不知道谷歌要弄清楚什么!

我只是希望运行这个文件,好像我在终端上一样,但是看起来Node有一些限制来阻止它失去控制。或者其他什么。

任何想法?! 感谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

mattCicomment中指出,{ stdio: 'inherit' }解决了它。