2016-07-21 4 views
2

ExpressでNode JSを使用していて、スクリプトを実行しようとしていて、そのスクリプトの出力をAJAX経由でクライアントに返しています。スクリプトは正常に完了していますが、何らかの理由で出力がポストレスポンスに表示されません。ノードJSの子プロセスからの出力で応答できないのはなぜですか?

let childProcess = require('child_process'); 

router.post('/update', (req, res) => { 
    childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => { 
     res.json({ error, stdout, stderr }); 
    }); 
}); 

ノードプロセスは、Foreverを使用して実行されます。私は永遠にログを見れば、それは示しています

永遠に検出されたスクリプトがシグナルによって殺された:SIGKILL

それが何を意味するのかわかりません。しかし、スクリプトは正常に完了しているようだ。

EDIT 下記のアイコンの回答にお答えください。私は次のことを試みたが、まだ行っていない。

router.post('/update', (req, res) => { 
    console.log('start...'); 

    childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => { 
     console.log('done'); 

     error = error || ''; 
     stdout = stdout || ''; 
     stderr = stderr || ''; 

     res.json({ error, stdout, stderr }); 
    }); 
}); 

は、コンソールで「完了」ログに記録したことがないので、成功関数が発射されることはありませんかのようです。上記の "start ..."とSIGKILLエラーがコンソールに記録されます。

+0

あなたは[EXECFILE](https://nodejs.org/api/child_process.html#child_process_child_process_execfile_file_args_options_callback)それが何のファイル –

+0

なので 'のように見えるupdate.sh'使用することを検討する必要がありますか?あなたのコードは単純なbashスクリプトで私のために働きます。 (あなたが言及しなかった他のルートがない限り) – Will

+0

ここにupdate.sh、shebangの上の行があります。#!/ bin/bash、git pull、npm install、 npmはビルドを実行し、永遠にrestartallします。 – wayofthefuture

答えて

1

それは子プロセスからの出力を読み取ることができ前に、あなたのスクリプトキル(再起動)そのもの。もう一度update.sh

見て:あなたはupdate.shの最後の行を削除することができ、および応答を送信した後、スクリプトがちょうど終了し、foreverが更新されたバージョンでそれを再起動する必要があり

#!/bin/bash 
git pull 
npm install 
npm run build 

#this command restarts your script 
forever restartall 

router.post('/update', (req, res) => { 
    childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, 
    (error, stdout, stderr) => { 
    res.json({ error, stdout, stderr }); 
    process.exit(); 
    }); 
}); 
+0

1.完全に素晴らしい。 2.私はこれを気付かなかったと信じられない、今私は気まずい感じ! – wayofthefuture

0

コードに構文エラーがあります。試してみてください:

res.json({ error: error, output: stdout, error_log: stderr }); 

代わりにあなたが行うことができます:

res.json([ error, stdout, stderr ]); 
+1

その構文はES6の一部です – wayofthefuture

+0

@WayOfTheFuture:ああ、私のソリューションはあなたのコードを修正します。私の説明だけが間違っているかもしれません。これがあなたのコードを修正する理由についてのAikonの答えを見てください。 – slebetman

1
  1. エラーが空でない場合は、出力が文字列化エラーが空のオブジェクトである後=>
  2. に失敗定義されていません。

'use strict'; 
let error = new Error('err'); 
let str = 'text'; 
let obj = {a: 10, b: 15}; // Try comment to get fall 
console.log(JSON.stringify({error, str, obj})) 
+0

この回答に対応するには上記の編集を参照してください。 – wayofthefuture

+0

次の操作を実行できます。1. Foreverをオフにしてコンソールを表示します。 2.コールバック関数を 'res.json({}) 'という1行に置き換えます(おそらく、フォールトの理由ではありません)。 3。'error = error || ''; 'あなたがエラーメッセージを失ったのでそれをしないでください。 4. 'update.sh'を1行に簡略化します。エコー 'ok'。また、 'update.sh'がアクセス可能で、あなたがそれを実行する権限を持っていることを確認してください。 –

関連する問題