2014-12-02 59 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流運行子進程。因此,您的程序不需要從管道讀取數據,因爲它不是管道。您執行的程序然後寫入終端,該終端讀取輸出,因此它不會阻止。