Back Ground

Node - 자식 프로세스 [child_process] 본문

Javascript/Node.js

Node - 자식 프로세스 [child_process]

Back 2019. 3. 11. 14:40



child_process


Node.js ChildProess‘는 자식프로세스 기능을 사용할 수 있게 한다. 

이 모듈을 사용하기 위해서는 다음 메서드로 자식 프로세스를 생성해야 한다.



1
require(‘child_process’).spawn(command, args=[], [options])
cs


options: 기본값은 { cwd:undefined, env:process.env, setsid: false } 이다. 

- ‘cwd’는 생성된 프로세스가 실행되는 디렉토리를 지정하는 것이고, 

- ‘env’는 새 프로세스가 접근할 수 있는 환경 변수를 지정, 

- ‘setsid’가 true이면 서브프로세스를 새 세션으로 생성하게 된다.

   (cluster 인 것 같다. )









child_process 종류


자식 프로세스는 child.stdin, child.stdout, child.stderr 의 3가지 종류의 스트림을 사용합니다.


다음은 디렉토리의 파일목록을 출력하는 예제입니다. ChildProcess도 EventEmitter의 객체여서 각 스트림에 이벤트 리스너를 등록할 수 있습니다:



spawn.js

1
2
3
4
5
6
7
8
9
10
11
12
13
var spawn = require('child_process').spawn, ls = spawn('ls', ['-a']);
 
ls.stdout.on('data'function(data) {
    console.log('stdout: ' + data);
});
 
ls.stderr.on('data'function(data) {
    console.log('stderr: ' + data);
});
 
ls.on('exit'function(code) {
    console.log('exit: ' + code);
});
cs



결과 

> node spawn.js

stdout: .

..

 

helloworld.js

nextTick.js

 

// ... 디렉토리의 파일 목록이 표시됨

 

exit: 0 







child_process.exec(command, [options], callback)


- ‘command’를 실행하고 결과를 돌려주는 함수이다. 

- 콜백함수는 function(error, stdout, stderr) { } 이다. 



- ‘options’ 들어가는 파라미터 기본값은 다음과 같다:

1
2
3
4
5
6
7
8
{
  encoding: 'utf8',
  timeout: 0,  // msec
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}
cs


timeout‘ 후에 프로세스를 종료하며 종료할 때killSignal‘을 쓴다.




execSync(동기 버전 )



exec의 동기 버전인 execSync가 있다

노드 0.11 버전부터 자식 프로세스의 커맨드를 동기로 실행할 수 있는 기능이 추가 되었다.


1
child_process.execSync(command[, options])
cs


동기 버전은 콜백을 받지 않으며 childprocess인스턴스 대신 stdout을 반환한다.

동기 버전에서 오류가 발생하면, 

그것은 던져 프로그램을 중단한다.


1
2
3
const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);
cs

출처: https://riptutorial.com/ko/node-js/example/9105/%EB%AA%85%EB%A0%B9%EC%9D%84-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0%EC%9C%84%ED%95%9C-%EC%89%98-%EC%83%9D%EC%84%B1


[예제]

1
2
3
function exec (cmd) {
  return require('child_process').execSync(cmd).toString().trim()
}
cs


1
2
3
4
5
6
7
8
if (shell.which('npm')) {
  versionRequirements.push({
    name'npm',
    currentVersion: exec('npm --version'),
    versionRequirement: packageConfig.engines.npm
  })
}
 
cs


shell 부분은 

https://backback.tistory.com/360 참고














문서 : http://nodejs.sideeffect.kr/docs/v0.8.15/api/child_process.html

출처 : http://chromeextension.kr/2016/08/node-js-childprocess-module/





child_process


Node.js ChildProess ' makes it possible to use child process functions. 

To use this module, you need to create a child process with the following method.



1
require(‘child_process’).spawn(command, args=[], [options])
cs


options: The default value is {cwd:undefined, env:process.env, setsid: false }. 

-'cwd' designates the directory where the created process is executed, 

-'env' specifies an environment variable that the new process can access, 

-If'setsid' is true, the subprocess is created as a new session.

   (It seems to be a cluster.)










child_process type


Child processes use three kinds of streams: child.stdin, child.stdout, and child.stderr.


The following is an example of printing the list of files in a directory. ChildProcess is also an object of EventEmitter so you can register event listeners on each stream




spawn.js

1
2
3
4
5
6
7
8
9
10
11
12
13
var spawn = require('child_process').spawn, ls = spawn('ls', ['-a']);
 
ls.stdout.on('data'function(data) {
    console.log('stdout: ' + data);
});
 
ls.stderr.on('data'function(data) {
    console.log('stderr: ' + data);
});
 
ls.on('exit'function(code) {
    console.log('exit: ' + code);
});
cs



result  

> node spawn.js

stdout: .

..

 

helloworld.js

nextTick.js

 

// ... displays a list of files in the directory

 

exit: 0 







child_process.exec(command, [options], callback)


-This is a function that executes'command' and returns the result. 

-The callback function is function(error, stdout, stderr) {}. 



-The default parameters for'options' are as follows:

1
2
3
4
5
6
7
8
{
  encoding: 'utf8',
  timeout: 0,  // msec
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}
cs


Timeout exits the process after " when exiting " killSigna writes l'.




execSync (synchronous version)



There is execSync , synchronous version of exec 

Starting with Node 0.11, the ability to synchronously execute commands of child processes has been added.



1
child_process.execSync(command[, options])
cs


The synchronous version does not receive a callback  and  returns stdout  instead of a  childprocess instance .

If an error occurs in the synchronous version, 

It throws and stops the program.



1
2
3
const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);
cs

Source:  https://riptutorial.com/ko/node-js/example/9105/%EB%AA%85%EB%A0%B9%EC%9D%84-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0%EC%9C%84%ED%95%9C-%EC%89%98-%EC%83%9D%EC%84%B1


[example]

1
2
3
function exec (cmd) {
  return require('child_process').execSync(cmd).toString().trim()
}
cs


1
2
3
4
5
6
7
8
if (shell.which('npm')) {
  versionRequirements.push({
    name'npm',
    currentVersion: exec('npm --version'),
    versionRequirement: packageConfig.engines.npm
  })
}
 
cs


shell part 

See https://backback.tistory.com/360







Document:  http://nodejs.sideeffect.kr/docs/v0.8.15/api/child_process.html

Source:  http://chromeextension.kr/2016/08/node-js-childprocess-module/








child_process


Node.js ChildProess」は、子プロセスの機能を使用できるようにする。 

このモジュールを使用するには、次のメソッドで、子プロセスを生成しなければならない。




1
require(‘child_process’).spawn(command, args=[], [options])
cs


options:デフォルトは{cwd:undefined、env:process.env、setsid:false}である。 

- 「cwd」は、生成されたプロセスが実行されているディレクトリを指定することで、 

- 「env」は、新しいプロセスがアクセスできる環境変数を指定し、 

- 「setsid」がtrueの場合、サブプロセスを新しいセッションで生成される。

   (clusterのようだ。)







child_process種類


子プロセスはchild.stdin、child.stdout、child.stderrの3種類のストリームを使用します。


以下は、ディレクトリのファイルのリストを出力する例です。ChildProcessもEventEmitterのオブジェクトなので、各ストリームにイベントリスナーを登録することができます:





spawn.js

1
2
3
4
5
6
7
8
9
10
11
12
13
var spawn = require('child_process').spawn, ls = spawn('ls', ['-a']);
 
ls.stdout.on('data'function(data) {
    console.log('stdout: ' + data);
});
 
ls.stderr.on('data'function(data) {
    console.log('stderr: ' + data);
});
 
ls.on('exit'function(code) {
    console.log('exit: ' + code);
});
cs



결과 

> node spawn.js

stdout: .

..

 

helloworld.js

nextTick.js

 

// ...ディレクトリのファイルのリストが表示される

 

exit: 0 







child_process.exec(command, [options], callback)


- 「command」を実行し、結果を返す関数である。 

- コールバック関数は、function(error、stdout、、stderr){}である。 




- 「options」入るパラメータデフォルト値は、次の通りである:

1
2
3
4
5
6
7
8
{
  encoding: 'utf8',
  timeout: 0,  // msec
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}
cs


timeout」の後のプロセスを終了し、終了したときにkillSigna l」を使う。




execSync(同期バージョン)



execの  同期バージョンであるexecSyncがある

ノード0.11バージョンから、子プロセスのコマンドを同期で実行することができる機能が追加されました。


1
child_process.execSync(command[, options])
cs


同期バージョンは、コールバックを受けず、  childprocessインスタンス  の代わりに  stdoutを  返します。

同期バージョンでエラーが発生した場合、 

それを投げるプログラムを中断する。



1
2
3
const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);
cs

出典:https://riptutorial.com/ko/node-js/example/9105/%EB%AA%85%EB%A0%B9%EC%9D%84-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0%EC%9C%84%ED%95%9C-%EC%89%98-%EC%83%9D%EC%84%B1


[例]

1
2
3
function exec (cmd) {
  return require('child_process').execSync(cmd).toString().trim()
}
cs


1
2
3
4
5
6
7
8
if (shell.which('npm')) {
  versionRequirements.push({
    name'npm',
    currentVersion: exec('npm --version'),
    versionRequirement: packageConfig.engines.npm
  })
}
 
cs


shell 部分は 

https://backback.tistory.com/360参考






記事:  http://nodejs.sideeffect.kr/docs/v0.8.15/api/child_process.html

出典:  http://chromeextension.kr/2016/08/node-js-childprocess-module/








Comments