Node.js 의 프로 세 스 관 리 를 깊이 이해 합 니 다.
본 고 는 주로 Node.js 에서 프로 세 스 관리 와 관련 된 것 에 대해 간단 한 소 개 를 하고 자 합 니 다.프로 세 스 대상,child_공정 모듈과cluster 모듈를 포함 하고 상세 한 API 는 공식 문 서 를 볼 수 있 습 니 다.다음은 상세 한 소 개 를 살 펴 보 겠 습 니 다.
프로 세 스 대상
process 는 Node.js 의 전역 대상 으로 require 명령 없 이 어디서 든 직접 사용 할 수 있 습 니 다.프로 세 스 대상 은 현재 node 프로 세 스 의 명령 행 인자,표준 입 출력,실행 환경 과 실행 상태 등 정 보 를 제공 합 니 다.
상용 속성
argv
process.argv
속성 은 하나의 배열 을 되 돌려 줍 니 다.첫 번 째 요 소 는 node 이 고 두 번 째 요 소 는 스 크 립 트 파일 이름 이 며 나머지 구성원 은 스 크 립 트 파일 의 인자 입 니 다.
$ node process-2.js one two=three four
0: /usr/local/bin/node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four
envprocess.env 는 현재 Shell 의 모든 환경 변 수 를 포함 하 는 대상 을 되 돌려 줍 니 다.예 를 들 어:
{
TERM: 'xterm-256color',
SHELL: '/bin/zsh',
USER: 'huangtengfei',
PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
PWD: '/Users/huangtengfei',
HOME: '/Users/huangtengfei'
}
이 속성의 일반적인 사용 장면 은,새로운 NODE 입 니 다.ENV 변 수 는 현재 처 한 개발 단 계 를 확인 하 는 데 사용 되 며,생 성 단 계 는 production 으로 설정 하고,개발 단 계 는 develop 으로 설정 한 다음 스 크 립 트 에서 읽 기process.env.NODE_ENV
한 다음 에 해당 하 는 처 리 를 하면 됩 니 다.스 크 립 트 를 실행 할 때 환경 변 수 를 이렇게 변경 할 수 있 습 니 다:
$ export NODE_ENV=production && node app.js
#
$ NODE_ENV=production node app.js
stdin/stdoutprocess.stdin
표준 입력(키보드 가 버퍼 에 있 는 것)을 가리 키 며 읽 을 수 있 는 흐름 을 되 돌려 줍 니 다.
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
process.stdout 은 표준 출력(사용자 에 게 내용 표시)을 가리 키 며 쓸 수 있 는 흐름 을 되 돌려 줍 니 다.
const fs = require('fs');
fs.createReadStream('wow.txt')
.pipe(process.stdout);
상용 방법cwd()
process.cwd()
노드 를 실행 하 는 작업 디 렉 터 리(절대 경로)를 되 돌려 줍 니 다.예 를 들 어 디 렉 터 리/Users/huangtengfei/abc 에서 node server.js 를 실행 하면process.cwd()
되 돌아 오 는 것 은/Users/huangtengfei/abc 입 니 다.또 다른 상용 경 로 를 얻 는 방법 은dirname,파일 을 실행 할 때 이 파일 이 파일 시스템 에 있 는 디 렉 터 리 를 되 돌려 줍 니 다.주의
process.cwd()
와__dirname
의 차이 점 은 전 자 는 프로 세 스 가 시 작 될 때의 위치 이 고 후 자 는 스 크 립 트 의 위치 이 며 이들 은 일치 하지 않 을 수 있 습 니 다.on()
process 대상 은 EventEmitter 인 터 페 이 스 를 배 치 했 습 니 다.
process.on()
방법 으로 각종 사건 을 감청 하고 리 셋 함 수 를 지정 할 수 있 습 니 다.예 를 들 어 시스템 이 프로 세 스 종료 신 호 를 보 낼 때 서버 를 닫 고 프로 세 스 를 종료 합 니 다.
process.on('SIGTERM', function () {
server.close(function () {
process.exit(0);
});
});
exit()process.exit()
Node 는 현재 프로 세 스(동기 화)를 즉시 종료 합 니 다.매개 변 수 는 종료 상태 코드 이 고 0 은 성공 을 표시 하 며 0 이상 의 임 의 정수 가 실 패 를 표시 합 니 다.kill()
process.kill()
특정 id 의 프로 세 스process.pid
에 신 호 를 보 내 는 데 사 용 됩 니 다.기본 값 은 SIGINT 신호 입 니 다.현재 프로 세 스 죽 이기:
process.kill(process.pid, 'SIGTERM');
이름 은 kill 이지 만 사실은process.kill()
신 호 를 보 내 는 것 만 책임 집 니 다.신 호 를 보 낸 후에 이 지정 한 프로 세 스 를 어떻게 처리 하 는 지 는 신호 종류 와 이 신 호 를 받 은 후에 어떤 조작 을 했 는 지(예 를 들 어 process.exit()
또는 console.log('Ignored this single')
에 달 려 있 습 니 다.Child Process 모듈
child_process 모듈 은 하위 프로 세 스 를 만 들 고 제어 하 는 데 사 용 됩 니 다.그 중에서 가장 핵심 적 인 것 은
.spawn()
이 고 다른 API 는 특정한 장면 에 대한 패키지 라 고 할 수 있 습 니 다.사용 하기 전에 먼저 require 가 들 어 와 야 합 니 다:
const cp = require('child_process');
exec(command[, options][, callback])exec()
방법 은 셸 명령 을 실행 하 는 데 사 용 됩 니 다.첫 번 째 매개 변 수 는 문자열 형식의 명령 입 니 다.두 번 째 매개 변 수 는 하위 프로 세 스 가 실 행 될 때의 맞 춤 형 작업 을 지정 하 는 데 사 용 됩 니 다.세 번 째 매개 변 수 는 명령 을 실행 한 리 셋 함 수 를 설정 하 는 데 사 용 됩 니 다.예 를 들 어 특정한 디 렉 터 리/Users/huangtengfei/abc 에서 ls -l
명령 을 실행 합 니 다.
cp.exec('ls -l', {
cwd: '/Users/huangtengfei/abc'
}, (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
})
spawn(command[, args][, options])spawn()
키 프로 세 스 를 만들어 특정 명령 을 수행 하 는 데 사 용 됩 니 다.exec()
와 달리 리 셋 함수 가 없고 감청 이벤트 로 만 실행 결 과 를 얻 을 수 있 습 니 다.하위 프로 세 스 가 장시간 실행 되 는 경우 에 적용 되 며 실시 간 으로 결 과 를 출력 할 수 있 습 니 다.
const ls = cp.spawn('ls', ['-l']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code $[code]`);
});
spawn 을 사용 하면 간단 한 데 몬 을 실행 할 수 있 습 니 다.작업 프로 세 스 가 정상적으로 종료 되 지 않 을 때 작업 프로 세 스 를 다시 시작 합 니 다.
/* daemon.js */
function spawn(mainModule) {
const worker = cp.spawn('node', [ mainModule ]);
worker.on('exit', function (code) {
if (code !== 0) {
spawn(mainModule);
}
});
}
spawn('worker.js');
fork(modulePath[, args][, options])fork()
키 프로 세 스 를 만 들 때 node 스 크 립 트 를 실행 합 니 다.fork('./child.js')
는spawn('node', ['./child.js'])
에 해당 합 니 다.fork 는 부자 프로 세 스 사이 에 통신 관(fork()의 반환 값)을 만들어 프로 세 스 간 통신 에 사용 하 는 것 과 차이 가 있 습 니 다.이 통신 파이프 대상 에 대해 message 이 벤트 를 감청 할 수 있 으 며,하위 프로 세 스 가 되 돌아 오 는 정 보 를 가 져 올 수도 있 고,하위 프로 세 스에 메 시 지 를 보 낼 수도 있다.
/* main.js */
const proc = cp.fork('./child.js');
proc.on('message', function(msg) {
console.log(`parent got message: ${msg}`);
});
proc.send({ hello: 'world' });
/* child.js */
process.on('message', function(msg) {
console.log(`child got message: ${msg}`);
});
process.send({ foo: 'bar' });
클 러 스 터 모듈Node.js 기본 단일 프로 세 스 가 실행 되 지만 다 중 핵 컴퓨터 의 자원 을 이용 할 수 없습니다.cluster 모듈 의 등장 은 이 문 제 를 해결 하기 위 한 것 입 니 다.서버 프로그램 을 개발 할 때 cluster 를 통 해 메 인 프로 세 스 와 여러 워 커 프로 세 스 를 만 들 수 있 습 니 다.모든 워 커 프로 세 스 가 하나의 핵 에서 실 행 될 수 있 도록 메 인 프로 세 스 감청 포트 와 배포 요청 을 통일 할 수 있 습 니 다.
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world
');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
상용 속성 및 방법isMaster/isWorker
cluster.isMaster
현재 프로 세 스 가 주 프로 세 스 인지 아 닌 지 를 판단 하 는 데 사 용 됩 니 다.cluster.isWorker
현재 프로 세 스 가 작업 프로 세 스 인지 아 닌 지 를 판단 하 는 데 사 용 됩 니 다.둘 다 불 값 을 되 돌려 줍 니 다.workers
cluster.workers
는 모든 워 커 프로 세 스 를 포함 하 는 대상 입 니 다.key 는worker.id
이 고 value 는 워 커 프로 세 스 대상 입 니 다.
// workers
function eachWorker(callback) {
for (const id in cluster.workers) {
callback(cluster.workers[id]);
}
}
eachWorker((worker) => {
worker.send('big announcement to all workers');
});
fork([env])cluster.fork()
방법 은 워 커 프로 세 스 를 새로 만 드 는 데 사 용 됩 니 다.기본 컨 텍스트 는 메 인 프로 세 스 를 복사 하고 메 인 프로 세 스 만 호출 할 수 있 습 니 다.상용 이벤트
listening
작업 프로 세 스 가 listening 방법 을 호출 하면 listening 사건 이 발생 합 니 다.이 사건 은
cluster.on('listening')
감청 할 수 있 습 니 다.예 를 들 어 워 커 프로 세 스 가 연 결 될 때마다 로그 정 보 를 출력 합 니 다.
cluster.on('listening', (worker, address) => {
console.log(
`A worker is now connected to ${address.address}:${address.port}`);
});
exit작업 프로 세 스 가 끊 겼 을 때 exit 이벤트 가 발생 합 니 다.이 이 벤트 는
cluster.on('exit')
감청 할 수 있 습 니 다.예 를 들 어 워 커 를 자동 으로 다시 시작 합 니 다:
cluster.on('exit', (worker, code, signal) => {
console.log('worker %d died (%s). restarting...',
worker.process.pid, signal || code);
cluster.fork();
});
작업 자 대상worker 대상 은
cluster.fork()
의 반환 값 으로 worker 프로 세 스 를 대표 합 니 다.worker.id
worker.id
는 현재 worker 의 유일한 표지 이자 cluster.workers
에 저 장 된 key 값 입 니 다.worker.process
모든 워 커 프로 세 스 는
child_process.fork()
를 통 해 생 성 되 며,이 프로 세 스 대상 은worker.process
에 저 장 됩 니 다.worker.send()
worker.send()
메 인 프로 세 스에 서 하위 프로 세 스에 메 시 지 를 보 내 고,하위 프로 세 스에 서 메 시 지 를 감청 하고process.on()
메 시 지 를 보 냅 니 다.
if (cluster.isMaster) {
const worker = cluster.fork();
worker.send('hi there');
} else if (cluster.isWorker) {
process.on('message', (msg) => {
process.send(msg);
});
}
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Express + AWS S3 이미지 업로드하기웹 사이트 및 모바일 애플리케이션 등에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공한다. AWS S3 에 저장된 객체에 대한 컨테이너...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.