ruby 将本地stdin管道传输到“heroku run”-不能写入stdout?4k stdout缓冲区?

lx0bsm1f  于 2022-11-22  发布在  Ruby
关注(0)|答案(1)|浏览(105)

我正在使用thor编写命令行任务(在rails 3应用程序中),并尝试通过heroku将输入传输给它们,例如cat somefile.csv | heroku run thor sometask
在我的本地机器cat somefile.csv | thor sometask上运行得很好,但是在heroku上可能会失败。sometasks的一些版本偶尔会工作,其他的总是在特定的点失败--一个问题是cat somefile.csv在被thor sometask使用时被回显到控制台(这只发生在heroku上,所以我认为这是heroku CLI内部的问题)。
我已经找到了一个解决办法,那就是确保我在thor任务和它们调用的函数中没有写任何东西到控制台(stdout),但是这样做是令人沮丧的(没有进度指示等)。
另一个“变通办法”是确保发送的文件小于4k(4095字节)-我还没有能够使它失败
知道为什么会发生这种情况吗(以及为什么cat会被回显到stdout)?是否有4k的stdout缓冲区限制,例如在通信过程中的某个地方?有什么方法可以使heroku CLI不那么冗长吗?

qv7cva1a

qv7cva1a1#

如果您使用“不向控制台写入任何内容”的解决方法,并使用pv而不是cat,则可以看到进度指示器。
输出可能如下所示:

$ pv somefile.csv | heroku run thor sometask
3.12MiB 0:00:00 [25.9MiB/s] [===============================================================================================================>] 100%

相关问题