[node.js] Node.js를 백그라운드 프로세스로 실행하고 결코 죽지 않는 방법?

퍼티 SSH를 통해 Linux 서버에 연결합니다. 나는 이것을 다음과 같은 백그라운드 프로세스로 실행하려고 시도했다.

$ node server.js &

그러나 2.5 시간이 지나면 터미널이 비활성화되고 프로세스가 종료됩니다. 어쨌든 터미널 연결이 끊긴 상태에서도 프로세스를 계속 유지할 수 있습니까?


편집 1

실제로, 나는 시도 nohup했지만 Putty SSH 터미널을 닫거나 인터넷을 뽑 자마자 서버 프로세스가 즉시 중지됩니다.

퍼티에서해야 할 일이 있습니까?


편집 2 (2012 년 2 월)

node.js모듈은, 영원히 . node.js 서버를 데몬 서비스로 실행합니다.



답변

간단한 솔루션 (프로세스로 돌아 오는 데 관심이 없다면 계속 실행하고 싶습니다) :

nohup node server.js &

jobs백그라운드 프로세스의 색인 된 목록을 보는 명령 도 있습니다. 그리고 당신은 실행하여 백그라운드로 프로세스를 종료 할 수 있습니다 kill %1또는 kill %2수는 프로세스의 인덱스 인 상태.

강력한 솔루션 (대화식 인 경우 프로세스에 다시 연결할 수 있음) :

screen

그런 다음 Ctrl + a + d를 눌러 분리 한 다음 다음을 실행하여 다시 부착 할 수 있습니다. screen -r

screen tmux의 새로운 대안도 고려하십시오.


답변

nohup node server.js > /dev/null 2>&1 &

  1. nohup의미 : stty가 끊어진 경우에도이 프로세스를 종료하지 마십시오.
  2. > /dev/null의미 : stdout은 / dev / null로 이동합니다 (출력을 기록하지 않는 더미 장치 임).
  3. 2>&1의미 : stderr도 stdout으로 이동합니다 (이미 리디렉션되었습니다 /dev/null). 오류 로그를 유지하기 위해 & 1을 파일 경로로 바꿀 수 있습니다. 예를 들면 다음과 같습니다.2>/tmp/myLog
  4. &마지막 의미 : 이 명령을 백그라운드 작업으로 실행하십시오.

답변

당신은 정말로 사용하려고합니다 screen. 그냥하는 것보다 조금 더 복잡 nohup long_running &하지만 다시는 다시 돌아 오지 않으면 화면을 이해 하는 것이 좋습니다.

처음에 스크린 세션을 시작하십시오.

user@host:~$ screen

원하는 것을 실행하십시오.

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

ctrl + A를 누른 다음 d. 끝난. 세션은 백그라운드에서 계속 진행됩니다.

0673.pts-0.srv가 항목 목록 인 경우 모든 세션을로 나열 screen -ls하고 screen -r 20673.pts-0.srv명령 으로 일부를 첨부 할 수 있습니다 .


답변

이것은 오래된 질문이지만 Google에서 높은 순위입니다. 화면 세션 내에서, &또는 nohup플래그 와 함께 node.js 프로세스를 실행하는 것은 단지 해결 방법 이기 때문에 가장 높은 투표 응답을 거의 믿을 수 없습니다 .

특히 screen / tmux 솔루션은 실제로 아마추어 솔루션 으로 간주되어야 합니다. Screen 및 Tmux는 프로세스를 계속 실행하기위한 것이 아니라 멀티플렉싱 터미널 세션을위한 것입니다. 서버에서 스크립트를 실행 중이고 연결을 끊고 싶을 때 좋습니다. 그러나 node.js 서버의 경우 프로세스가 터미널 세션에 연결되기를 원하지 않습니다. 이것은 너무 연약하다. 작업을 계속 실행하려면 프로세스를 데몬으로 사용해야합니다!

이를위한 좋은 도구가 많이 있습니다.

PM2 : http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

PM2에 유리한 한 가지 큰 장점은 시스템 시작 스크립트를 생성하여 프로세스가 다시 시작될 때까지 프로세스를 지속시킬 수 있다는 것입니다.

$ pm2 startup [platform]

어디 platform있을 수 있습니다 ubuntu|centos|redhat|gentoo|systemd|darwin|amazon.

forever.js : https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

초기화 스크립트 :

나는 init 스크립트를 작성하는 방법에 대해 자세히 설명하지 않습니다. 왜냐하면 나는이 주제의 전문가가 아니며이 답변에 너무 오래 걸리기 때문에 기본적으로 OS 이벤트에 의해 트리거되는 간단한 쉘 스크립트입니다. 이에 대한 자세한 내용은 여기를 참조하십시오

도커 :

단지와 부두 노동자 컨테이너에 서버를 실행하는 -d옵션을 선택하고, 짜잔 , 당신은 daemonized Node.js를 서버가 있습니다!

다음은 샘플 Dockerfile입니다 (node.js 공식 안내서 ).

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

그런 다음 이미지를 빌드하고 컨테이너를 실행하십시오.

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

이 페이지에 누군가가 방문하는 데 도움이되기를 바랍니다. 항상 작업에 적합한 도구를 사용하십시오. 많은 두통과 시간을 절약 할 수 있습니다!


답변

다른 해결책은 그 일을 버리다

$ nohup node server.js &
[1] 1711
$ disown -h %1


답변

nohup터미널이 죽은 후에도 프로그램을 계속 사용할 수 있습니다. 실제로 nohupSSH 세션이 올바르게 종료되지 않는 상황이 있었 으므로 입력도 리디렉션해야합니다.

$ nohup node server.js </dev/null &

nohup구성 방법에 따라 표준 출력 및 표준 오류를 파일로 리디렉션해야 할 수도 있습니다.


답변

@Yoichi의 ​​답변을 기반으로 쉘 rc 파일 에이 기능이 있습니다.

nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    nohup "$1" > /dev/null 2>&1 &
}

이 방법으로 사용할 수 있습니다 :

nohup-template "command you would execute here"