ノード上で端末を実行

5790 ワード

ノードバックエンドAPIで端末コマンドを実行します。


NodeのBuiltInモジュールchild_processが提供されています.child_processまとめてみます.
child processは、ノードを実行するコンピュータのオペレーティングシステムまたはカーネル上で大きな演算量を実行することを可能にする.ウィンドウのcmd,macのterminalは,ノードによって実行される.child processは、ノードが実行できない操作を許可します.child_processを使用する方法は大きく2つあります.spawn()およびexec()です.二人は同じことをしますが、やり方が違うので、状況によって書けばいいです.
最大の違いは、spawnがストリームとして、execがバッファとして動作することである.(この記事ではspawnのみ使用) 両者の違いはStackoverflowでよくまとめられている。(リンク) spawnを使用します.△spawnを翻訳すると「産卵」が現れます.最初は不思議でしたが、新しいプロセスを作成して実行しているので、これは適当な言葉のようです.
spawnはstdin,stdout,stderrを用いる.
  • stdin親プロセスから子プロセスにデータを送信します.
  • サブプロセスは、
  • stdoutを使用してデータを出力します.
  • stderrコマンドのエラーを出力します.
  • // 1. spawn을 불러오고.
    import { spawn } from 'child_process';
    
    function spawnTest() {
      return new Promise(function(resolve, reject) {
        // 2. spawn을 이용하여 새 프로세스를 만듭니다.
        let process = spawn('bash');
    
        // 3. 실행할 명령을 작성합니다.
        // '\n' 은 엔터입니다. terminal 이기 때문에 엔터로 명령어를 입력해야 실행되겠죠?
        const command = 'ls -al \n'; // a: 숨긴 파일까지 , l: 자세한 내용까지 검색
    
        try {
          // 4. 부모 프로세서에서 자식프로세서로 명령을 보냅니다.
          process.stdin.write(command);
          
          // stdin을 이용할때는 end()로 반드시 입력을 끝내야합니다.
          process.stdin.end(); 
    
          // 5. 명령이 모두 실행됐다면 'close' 이벤트가 발생합니다.
          process.on('close', function (code) {
            console.log('end')
            resolve(code);
          });
        } catch (err) {
          console.log('error')
          reject(err);
        }
      })
     }
    現在位置ファイルリストに関する情報を表示するspawnTest()関数.child processを使用する場合、多くの場合非同期であるため、約束を返すコードを作成しました.
    spawnとexecの違いについて述べたように,spawnはStreamからなるので,イベントを検出することができる.したがって、「close」イベントが検出されます.
    コードに書いてある数字に従ってやればいいです.
    1.spawnを召喚し、
    2.生鮮新工芸.
    3.実行する文を入力します.
    4.親ハンドラによって作成された文をサブハンドラとして転送します.
    5.文が完了したことを知る必要がある場合は、「close」イベントを検出して使用します.
    上手に作られた言語なので、簡単に使えます.