2017-08-23 3 views
0

nodejsアプリケーションからbashスクリプトを実行する必要があります。通常、私はこのようなものだろう:nodejsからシェルスクリプトを正しく実行するには

var childProcess = require('child_process'); 
childProcess.execFile('./test.sh', function (error, stdout, stderr) { 
    console.log(error, stdout, stderr); 
}) 

をしかし、私は最近、それがそのように実行されたときに終了しませんbashスクリプトに走りました。 -

  • tr -dc "a-zA-Z0-9" < /dev/urandom ASCII文字としてすべてを解釈するtrを強制 - 擬似ランダムバイトを読んで、a-zA-Z0-9
  • fold -w 8以外のすべてを捨てる - 出力をラップ

    #!/bin/bash 
    LC_CTYPE=C cat /dev/urandom | tr -dc "a-zA-Z0-9" | fold -w 8 | head -n 1 
    
    • LC_CTYPE=C:これは、問題を再現する最小限の例です。行8文字以内
    • head -n 1 - 最初の行を読み取る(8文字)

    端末から実行すると、それが正常に動作し、それがすぐに終了:

    # ./test.sh 
    0J5hsGeh 
    

    以上使用して実行すると、スクリプトをnodejsそれだけでハング:

    # node test.js 
    

    screenshot from htop command

    head -n 1はすでに終了していますが、cat /dev/urandomはまだ実行中です。

    質問:nodejsからスクリプトを実行してハングしないようにするにはどうすればよいですか?

    ENV:

    • OS:Ubuntu 16.04
    • Nodejsバージョン:v6.11.2
  • +0

    はあなたのシェバングに-xを設定し、あなたのbashスクリプト –

    +0

    の最後に 'exit'コマンドを追加やbash -xを経由して、それを実行してみてください、私たちは、 –

    +0

    男を何が起こっているかの鮮明な画像を持っているでしょうに感謝提案。しかし、彼らは役に立たない。スクリプトの最後の 'exit'は何もしません。この場合、前の行は決して終了しないので実行されません。'-x'は、スクリプトが決して終了しないので、' -x'によって生成された出力が出力されないので、助けになりません。とにかく、私はbashスクリプトをデバッグしようとしていません。私はnodejsを使ってそれを実行することがなぜ違いがあるのか​​を調べようとしています。 – Prvaak

    答えて

    0

    これは事実そのNodeJS ignores SIGPIPE signalによって引き起こされます。サブプロセスが生成されると、SIGPIPEシグナルは生成されたサブプロセスによっても無視されます。

    catコマンドは、最初の行を読み取った後でheadが終了した後にパイプが切断されたときに終了しません。したがって、catは、/dev/urandomから永久にデータを読み取ります。

    NodeJSの将来のバージョンのいずれかでは、fixedである必要があります。今のところ私はthat issueの回避策を使用しています。

    var childProcess = require('child_process'); 
    process.on('SIGPIPE', noop); // <---- 
    childProcess.execFile('./test.sh', function (error, stdout, stderr) { 
        console.log(error, stdout, stderr); 
    }) 
    process.removeListener('SIGPIPE', noop); // <---- 
    
    関連する問題