1

私がやっていることの要点は次のとおりです: https://gist.github.com/MattCollins84/75f9ebd422ed6d1d5c91

プロセスの一部として、大量の curl コマンド (約 20k コマンド) を含む bash スクリプトを生成します。ノード経由でこのスクリプトを実行したい。

これを行うためにスポーンを使用していますが、正常に動作します。ただし、70 個ほどのコマンドを実行すると、停止します。spawn によって作成された readstream は、データの出力を停止します。私が見る限り、エラーはありません。

「ps x | grep curl」を実行して何が起こっているかを確認すると、最初はプロセス ID が変更されていることがわかりますが、特定の時点で停止しているように見え、二度と開始されません。プロセスがハングするだけです。このプロセスを手動で強制終了すると、次のプロセスを開始できなくなります。また、私の bash スクリプトに関連するプロセスはまだ存在していますが、これも違いはありません。

私が除外した観察と事柄:

  • 最小限のリソースの使用
  • 端末で生成されたbashスクリプトを実行すると正常に動作します
  • カーリングしている URL は問題ではないようです (つまり、それは私のアプリケーションではありません)。

何かが欠けている気がしますが、Google で何を調べればよいのかわかりませんでした。

このファイルを端末上にいるかのように実行することを望んでいましたが、制御不能な実行を停止するためにノードが何らかの制限を課しているようです。か何か。

何か案は?!ありがとう

4

2 に答える 2

2

Node の spawn 関数については詳しくありませんが、Unix のパイプについてはよく知っています。最初のシナリオでは、実行したプログラムが出力を生成しましたが、プログラムはその出力を読み取らなかったようです。パイプのバッファがいっぱいになると、実行したプログラムはパイプへの書き込みをブロックします。プログラムがパイプから読み取ると、ブロックが解除されます。

あなたが見つけた解決策 ( stdio: 'inherit') は、おそらく同じ stdout、stderr、および stdin ストリームで子プロセスを実行するよう関数に指示します。したがって、パイプではないため、プログラムはパイプから読み取る必要はありません。実行したプログラムはターミナルに書き込み、ターミナルは出力を読み取るため、ブロックされません。

于 2015-10-30T16:52:17.630 に答える