node 에서 서비스 프로 세 스 만 들 기
node 프로젝트 배치 에 있어 서 로 컬 클 라 이언 트,널뛰기,서버(클 러 스 터)와 자주 관련 됩 니 다.git 를 통 해 gitlab hook 스 크 립 트 를 실행 한 후,스 킵 에서 해당 하 는 ssh 명령 을 실행 하여 셸 파일 을 실행 하여 node 서버 를 시작 해 야 합 니 다.이것 은 자주 사용 하 는 명령 setsid 를 사용 해 야 합 니 다.이렇게 ssh 명령 이 실 행 된 후에 도 node 서버 는 정상적으로 실 행 됩 니 다.이때 node 서비스 프로 세 스 는 가장 전형 적 인 daemon 프로 세 스(백 엔 드 서비스 프로 세 스)입 니 다.
그렇다면 node 프로젝트 에서 데 몬 프로 세 스 를 어떻게 만 듭 니까?가장 간단 한 방식 은 바로 앞에서 소개 한 것 과 비슷 한 방식 을 사용 하 는 것 이다.
require('child_process').exec('setsid node app.js >/dev/null 2>&1 &');
이렇게 하면 셸 을 실행 하 는 방식 으로 daemon 프로 세 스 를 실현 할 수 있 습 니 다.그러나 본 논문 의 중점 은 이러한'명령 행'방식 으로 daemon 프로 세 스 를 실현 하 는 것 이 아니 라 본 고 는 daemon 프로 세 스 의 생 성 원 리 를 상세 하 게 설명 하고 다음 글 을 살 펴 보 겠 습 니 다.목표.
현재 업무 에서 데 몬 프로 세 스 를 만들어 야 하 는 이 유 는 이 프로 세 스 를 만 드 는 부모 프로 세 스(ctrl+c)를 중단 하거나 부모 프로 세 스 가 실 행 된 후에 데 몬 프로 세 스 의 실행 에 영향 을 주지 않도록 하기 위해 서 입 니 다.다음은 두 가지 실현 방식 을 소개 하 는데 실현 원리 의 세부 적 인 부분 에 약간의 차이 가 있다.
다음 글 의 모든 토론 은 Liux 환경 에서 진행 된다.
실현
Liux 시스템 에서 부모 프로 세 스 는 하위 프로 세 스 를 만 듭 니 다.이 때 부모 프로 세 스 가 종료 되면 하위 프로 세 스 는 고아 프로 세 스 로 변 합 니 다.ppid 는 1 로 변 합 니 다.즉,init 프로 세 스 의 하위 프로 세 스 가 됩 니 다.node 환경 에서 하위 프로 세 스 의 stdio 에 대해 특별한 처 리 를 하지 않 으 면 부모 프로 세 스 가 진정 으로 종료 되 지 않 고 하위 프로 세 스 가 실 행 될 때 까지 종료 합 니 다.이 는 node 가 하위 프로 세 스 를 만 들 때 기본적으로 pipe 방식 으로 하위 프로 세 스 의 출력 을 부모 프로 세 스 의 stream(childProcess.stdout,childProcess.stderr)으로 유도 하여 부모 프로 세 스 에서 하위 프로 세 스 정 보 를 출력 하 는 능력 을 제공 하기 때 문 입 니 다.
따라서 이 문 제 를 해결 하면 하위 프로 세 스 의 stdio 에 값 을 다시 부여 할 수 있 습 니 다.
file: parent.js
let cp = require('child_process');
const sp = cp.spawn('node',['./c.js'],{
stdio: [process.stdin,process.stdout,process.stderr]
});
setTimeout(()=>{console.log('parent out')},5000);
--------------
file: c.js
setTimeout(()=>{
console.log('children exit');
},10000)
parent.js 에서 하위 프로 세 스 를 설정 한 stdio 를 현재 터미널 로 설정 합 니 다.(사실은 부모 프로 세 스 를 계승 한 stdio)부모 프로 세 스 는 5s 후에 종료 합 니 다.이때 하위 프로 세 스 의 ppid 는 1,10s 후 하위 프로 세 스 가 종 료 됩 니 다.이 는'부모 프로 세 스 가 정상적으로 종료 되 고 하위 프로 세 스 가 데 몬 이 됩 니 다'만 만족 시 키 는 경우 입 니 다.'ctrl+c'방식 으로 부모 프로 세 스 를 종료 하면 하위 프로 세 스 가 종 료 됩 니 다.이것 은 node 바 텀 실현 과 관련 이 있 습 니 다.기본"ctrl+c"는 SIGINT 신 호 를 촉발 합 니 다.부모 프로 세 스 가 신 호 를 받 은 후 하위 프로 세 스에 보 냅 니 다.하위 프로 세 스 에 SIGINT 탐지 함수 가 존재 하면 이 함 수 를 실행 합 니 다.그렇지 않 으 면 exit 시스템 호출 하위 프로 세 스 가 종 료 됩 니 다.따라서 하위 프로 세 스 가 SIGINT 신 호 를 받 고 종료 하지 않 으 려 면 처리 하지 않 으 면 됩 니 다.
file: c.js
process.on('SIGINT',function(){
console.log('child sigint');
});
setTimeout(()=>{
console.log('children exit');
},10000)
이상 의 실현 은 우리 가 최초 로 지정 한 목 표를 만족 시 킬 수 있 습 니 다."부모 프로 세 스 가 종료 되 거나 중단 되 었 으 며,하위 프로 세 스 는 여전히 정상적으로 실행 되 고 있 습 니 다."실현 2
node 는 공식 적 으로 daemon 프로 세 스 를 만 드 는 관련 API 를 제공 합 니 다.문 서 를 자세히 읽 지 않 으 면 이 기능 을 쉽게 발견 할 수 없습니다.childprocess 모듈 에 spawn 함수 가 있 습 니 다.spawn 을 통 해 셸 명령 과 관련 된 옵션 을 실행 할 수 있 습 니 다.또한 spawn 은 하위 프로 세 스 를 만 드 는 옵션 을 제공 합 니 다.그 중에서"detached"옵션 은 우리 의 요구 와 밀접 한 관 계 를 가 집 니 다.
detached 옵션 을 사용 하면 node 원생 이 daemon 프로 세 스 를 만 들 수 있 습 니 다.datached 를 true 로 설정 하면 새로운 session 과 프로 세 스 그룹 을 만 들 수 있 습 니 다.하위 프로 세 스 의 pid 는 프로 세 스 그룹 을 새로 만 드 는 그룹 pid 입 니 다.이것 은 setsid 와 같은 역할 을 합 니 다.이 때 하위 프로 세 스 는 부모 프로 세 스 와 두 개의 session 에 속 하기 때문에 부모 프로 세 스 의 종료 와 중단 신 호 는 하위 프로 세 스에 전달 되 지 않 습 니 다.하위 프로 세 스 는 부모 프로 세 스 의 중단 신 호 를 받 아들 이지 않 고 자 연 스 럽 게 종료 되 지 않 습 니 다.부모 프로 세 스 가 끝 난 후,하위 프로 세 스 는 고아 프로 세 스 로 바 뀌 어 init 프로 세 스 에 의 해 받 아들 여지 고,ppid 는 1 로 설정 되 어 있 습 니 다.
file: parent.js
let cp = require('child_process');
const sp = cp.spawn('node',['./c.js'],{
detached: true,
stdio: [process.stdin,process.stdout,process.stdout]
});
sp.unref();
setTimeout(()=>{console.log('parent out')},5000);
----------------------
file: c.js
setTimeout(()=>{
console.log('children exit');
},100000)
이 때 c.js 파일 은 SIGINT 사건 수사 함 수 를 설정 하지 않 았 습 니 다.부모 프로 세 스 가 중 단 된 후에 도 정상적으로 실 행 됩 니 다.바로 부모 프로 세 스 와 두 개의 session 으로 나 뉘 기 때 문 입 니 다.parent.js 파일 에 sp.unref()함 수 를 설정 하 였 습 니 다."부모 프로 세 스 가 하위 프로 세 스 가 종료 되 기 를 기다 리 는 것 을 피하 기 위해 서 입 니 다."그렇다면 왜 이런 상황 이 벌 어 졌 을 까?이것 은 node 의 이벤트 순환 과 관련 이 있 습 니 다.부모 프로 세 스 의 이벤트 순환 은 ChildProcess 하위 프로 세 스 대상 에 대한 인용 을 제외 하고 부모 프로 세 스 를 단독으로 종료 할 수 있 습 니 다.
총결산
왜 위 에서 소개 한 두 가지 방법 모두 daemon 프로 세 스 를 실현 할 수 있 습 니까?시스템 차원 으로 돌아 가 분석 해 야 한다.Liux 시스템 에서 daemon 프로 세 스 를 만 드 는 데 몇 가지 절차 가 필요 합 니 다.
1.부모 프로 세 스 가 자식 프로 세 스 를 만 들 고 부모 프로 세 스 가 종료 되 며 자식 프로 세 스 를 고아 프로 세 스 로 만 듭 니 다.ppid=1
2.setsid 명령 이나 함 수 를 통 해 하위 프로 세 스에 새 세 션 과 프로 세 스 그룹 을 만 듭 니 다.
3.현재 디 렉 터 리 설정
4.파일 권한 을 설정 하고 부모 프로 세 스 계승 열 린 fd 를 닫 습 니 다.
세 션 과 프로 세 스 그룹 이란 Liux 다 중 태 스 크 다 중 사용자 의 개념 입 니 다.서로 다른 세 션 의 프로 세 스 가 통신 을 통과 할 수 없 기 때문에 부자 프로 세 스 가 격 리 됩 니 다.setsid 명령 을 실행 하면 하위 프로 세 스 가 새로운 기능 을 가지 게 됩 니 다:
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Node.js를 AWS서버에서 사용하는 실습간단한 예제와 함께 AWS에서 Node.js를사용하는 법을 배워보도록 하겠다. 해당 github에 있는 레포지토리로 사용을 할 것이다. 3000번 포트로 Listen되는 예제이고 간단히 GET, POST, DELET...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.