0

node.jsに関する限り、私は初心者です.2つのLinuxコマンドをパイプライン化するために次のコードを記述しました。これは私のnodejsコードです:

var spawn = require('child_process').spawn,
    ls = spawn('ls',['-lh','/usr']),
    grep = spawn('grep',['bin']);

/*
ls.stdout.on('data',function(data){
    console.log('stdout: '+data);
});
*/

ls.stdout.on('data',function(data){
    console.log(""+data);
    grep.stdin.write(data);
});

ls.stderr.on('data',function(data){
    console.log('stderr: '+data);
});


ls.on('exit',function(code){
    console.log('Exit code '+code);
    grep.stdin.end();
})

// ------------------------------------

grep.stdout.on('data',function(data){
    console.log('stdout: '+data);
});

grep.stderr.on('data',function(data){
    console.log('stderr: '+data);
});

今、このコードは時々失敗し、時々実行されます。私は今混乱しています。それが失敗すると、それは言います:

Exit code 0
total 160K
drwxr-xr-x   2 root root  68K Oct 12 12:54 bin
drwxr-xr-x   2 root root 4.0K Jun 20 19:58 games
drwxr-xr-x  54 root root 4.0K Sep 24 17:52 include
drwxr-xr-x 252 root root  44K Oct  2 21:53 lib
drwxr-xr-x  10 root root 4.0K Apr 28 19:16 local
drwxr-xr-x   2 root root  12K Sep 18 15:51 sbin
drwxr-xr-x 362 root root  12K Sep 28 17:58 share
drwxr-xr-x   5 root root 4.0K Jul  7 23:39 src


events.js:66
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: This socket is closed.
    at Socket._write (net.js:517:19)
    at Socket.write (net.js:509:15)
    at Socket.<anonymous> (/home/rajat/nodexperiments/full-spawn.js:13:13)
    at Socket.EventEmitter.emit (events.js:88:17)
    at Pipe.onread (net.js:395:14)

そしてそれが実行されるとき、それは言います:

total 160K
drwxr-xr-x   2 root root  68K Oct 12 12:54 bin
drwxr-xr-x   2 root root 4.0K Jun 20 19:58 games
drwxr-xr-x  54 root root 4.0K Sep 24 17:52 include
drwxr-xr-x 252 root root  44K Oct  2 21:53 lib
drwxr-xr-x  10 root root 4.0K Apr 28 19:16 local
drwxr-xr-x   2 root root  12K Sep 18 15:51 sbin
drwxr-xr-x 362 root root  12K Sep 28 17:58 share
drwxr-xr-x   5 root root 4.0K Jul  7 23:39 src

Exit code 0
stdout: drwxr-xr-x   2 root root  68K Oct 12 12:54 bin
drwxr-xr-x   2 root root  12K Sep 18 15:51 sbin

何か案は?

4

1 に答える 1

0

これは明らかに競合状態です。node.js は高度な並列環境であるため、これを実証するための非常に優れた例が見つかりました。

ls.on('exit',function(code){
    console.log('Exit code '+code);
    grep.stdin.end();
})

ls は、grep への書き込みが完了する前に上記のイベントを発生させ、通信に使用されているソケットを閉じます。出力から得られるヒントは、ls からの exit(0) メッセージが出力の上部に 1 回、エラー メッセージのすぐ上に 1 回表示されることです。

ここで grep の stdin チャネルを閉じてはいけません。

しかし、次のようなことを行うbashスクリプトで spawn の代わりに .exec() を使用するのはどうですか

#/bin/bash mybashscript
ls $1 | grep bin

そして、次のような JavaScript クロージャーを使用します。

child = exec('mybashscript',['-lh','/usr']
  function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

イベントを使用すると、コードの順序が読みにくくなります。

于 2012-10-12T12:36:16.323 に答える