2017-01-12 10 views
2

ssh2 nodejsモジュールを使用してUNIXアプリケーションに接続し、スクリプトを実行すると成功です。 今、私は複数のサーバーに1つずつ接続し、出力を取得して保存したいと考えています。 私はssh2への入力としてjsonからサーバーを1つずつ渡すためにforループを使用しようとすると、forループはサーバーからの出力を取得するブロックよりもはるかに高速に完了します。 これはまた私にハンドシェークエラーを引き起こしています。親切にここssh2が複数のサーバーに接続して出力ノードを取得

を助ける は約束の工場を使用して... SSH2で正しく非同期問題を処理するようにしてください、あなたのコードを見ずにコード

inc_cron.schedule("*/20 * * * * *", function(id) {  
     }); 

//inc_cron.js 

var cronFunction = function(inputStr) { 
        if(appNames['applications'].length>0){ 
           for (i = 0; i < appNames["applications"].length; i++) { 
            getDataFromServer(appNames["applications"][i].Name,appNames["applications"][i].hostname, appNames["applications"][i].username, appNames["applications"][i].password, appNames["applications"][i].log_path, function(err, data) { 
               if(err) { 
                logger.info("Error is in cronFunction = ", err); 
               } else if(data) { 
                   output_data +=data; 
               } ssh.close_second(); 
            }); 
           } 
       } 
} 

var getDataFromServer = function(Name,hostname, username, password, log_path, cb) { 
    ssh.close_second(); 
    ssh.connect_second({ 
    host: hostname, 
    username: username, 
    password: password 
    }, function(err) { 
    if(err) { 
     logger.error('Err: ', err); 
    } else { 
           ssh.sftp("",'grep -o "ERROR" '+log_path+'.log.'+yr+'-'+mnth+'-* | wc -l', function(err, data) { 
                 cb(err, data); 
           });  } }); } 


//connect.js 

SSHConnection.prototype.sftp = function(type, path, cb) { 
    var self = this; 
    var log_data = ''; 
    self.connection2.exec(path +' ' + type, { pty: true }, function(err, stream) { 
       if (err) { 
     logger.log('SECOND :: exec error: ' + err); 
    } 
       stream.on('end', function() { 
     self.connection2.end(); // close parent (and this) connection 
    }).on('data', function(data) { 
     logger.info(data.toString()); 
    }); 
        }); 
}; 
+0

あなたはこれまでのコードを私たちに教えてください。 –

+0

@Holger私は今コードを追加しました... – Shashank

答えて

0

これを行う1つの方法は、es7 async awaitを使用することです。

var getDataFromServer = function(Name,hostname, username, password, log_path, cb) { 
    return new Promise(function(resolve,reject){ 
     ssh.close_second(); 
     sh.connect_second({ 
      host: hostname, 
      username: username, 
      password: password 
     },function(err) { 
      if(err){ 
       reject(err) 
      }else{ 
       ssh.sftp("",'grep -o "ERROR" '+log_path+'.log.'+yr+'-'+mnth+'-* | wc -l', function(err, data) { 
        if(err){ 
         reject(err) 
        }else{ 
         resolve(data) 
        } 
       }) 
      } 
     }) 
    }) 
} 

今は非同期機能であるためにあなたのcron機能を書き換えることができます。このためには、約束を返すために、あなたのgetDataFromServer機能を書き換える必要があります。

var cronFunction = async function(inputStr) { 
    if(appNames['applications'].length>0){ 
     for (i = 0; i < appNames["applications"].length; i++) { 
      try{ 
       output_data + = await getDataFromServer(appNames["applications"][i].Name,appNames["applications"][i].hostname, appNames["applications"][i].username, appNames["applications"][i].password, appNames["applications"][i].log_path) 
      }catch(err){ 
       logger.info("Error is in cronFunction = ", err); 
      } 
      ssh.close_second(); 
     } 
    } 
} 

async awaitを使用すると、非同期コードを同期コーディングスタイルで書き込むことができます。 しかし、現在のところ、async awaitはフラグ(--harmony-async-await)の後ろに隠れています(ノード7. *)。このコードは、現在テストされていないと:この機能を使用すると、現在

node --harmony-asyn-await yourapp.js 

PSを使用する必要がありますので、あなたのアプリを起動するために4月2017

にupcommingノードリリース(8.0.0)ではデフォルトで有効になりますおそらくバグが含まれています。私は明日テストすることができるかもしれません...しかし、あなたは考えを得る

+0

ありがとう...それを試してみる...... :) また、私はもう一つ間違いを言って忘れていました.... forループは約20時間.....そして数がヒット20 ....私は手のひらのエラーを得る.......それについての任意の提案??? – Shashank

+0

は 'async await'と一緒にすべきです。常に1つのオープンな接続が存在するためです。 –

関連する問題