1

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

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

我正在使用 spawn 来执行此操作,并且效果很好。除了在 70 个左右的命令之后,它就停止了。spawn 创建的 readstream 停止输出任何数据。据我所知,没有错误或任何错误。

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

我已经排除的观察和事情:

  • 使用最少的资源
  • 在终端上运行生成的 bash 脚本工作正常
  • 我卷曲的 URL 似乎并不重要(即它不是我的应用程序)

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

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

有任何想法吗?!谢谢

4

2 回答 2

2

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

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

于 2015-10-30T16:52:17.630 回答
1

正如mattCi在他的评论中指出的那样,{ stdio: 'inherit' }解决了它。

于 2015-10-01T13:24:55.613 回答