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


480

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

$ node server.js &

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


편집 1

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

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


편집 2 (2012 년 2 월)

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


7
필자의 경우 nohup은을 입력하여 터미널을 종료 할 때 작동합니다 exit. 퍼티 창을 닫으면 실패합니다.
Pawel Furmaniak

답변:


513

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

nohup node server.js &

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

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

screen

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

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


1
"스크린"을 실행하면 스크린을 만들어 그 안에서 실행합니다.
murvinlai

30
예. 그런 다음 Ctrl + a, d를 눌러 분리 한 다음 screen -r
MK를

1
@murvinlai EC2는 환경이며 루트 권한과 관련이 없습니다. 아마 AMI에 관한 것입니다. 예를 들어 Amazon AMI를 사용하면 확실히 할 수 있습니다 sudo bash.
ShuaiYuan

1
man bash : 제어 연산자 &에 의해 명령이 종료되면, 쉘은 백그라운드에서 서브 쉘의 명령을 실행합니다. 쉘은 명령이 완료되기를 기다리지 않고 리턴 상태는 0
입니다.

34
화면 내부 Node.js를 서버를 실행하거나 TMUX 세션은이다, 사람이 읽기 바랍니다 아마추어 솔루션! 빠른 테스트가 아니라면 그렇게하지 마십시오. 프로세스를 계속 실행하려면 데몬초기화 해야합니다! forever , pm2 또는 평범한 이전 init.d 스크립트 와 같은 적절한 도구를 사용하십시오 .
Victor Schröder

1119

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. &마지막 의미 : 이 명령을 백그라운드 작업으로 실행하십시오.

49
현재 승인 된 것보다 품질이 훨씬 높기 때문에 이것이 허용되는 답변이어야합니다.
L0j1k

2
@ L0j1k는 논란의 여지가 있지만 OP는 대답에 대한 추가 설명이 필요하다는 이해 수준을 보여주었습니다.
JFA

41
따라서 OP에 관한 질문만큼 수천명의 사람들이 OP에 대한 질문만큼 OP에 관한 것이 아닙니다.
L0j1k 2016

3
stdout 및 stderr을 리디렉션해야합니까? 전혀 리디렉션하지 않으면 제대로 작동합니까? 또는 대신 파일로 리디렉션하면?
Shawn

10
stdout AND stderr를 /dev/null? 좋은 로깅 ... 행운을 빌어 요 이것을 디버깅하려고 ...
Victor Schröder

138

당신은 정말로 사용하려고합니다 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명령 으로 일부를 첨부 할 수 있습니다 .


125

이것은 오래된 질문이지만 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

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


2
이것이 내가 찾던 것입니다. pm2 솔루션을 사용하면 나중에 터미널을 연결하는 방법이 있습니까?
Quantumplation

4
퀀텀 펌프 (Quantumplation) 프로세스가 대화식 세션에서 실행되고 있지 않기 때문에 불가능합니다. 그러나 tail -fpm2가 생성하는 로그 파일을 사용 하여 동일한 "느낌"을 가질 수 있습니다 .
Victor Schröder

1
screen많은 사람들이 찾고 있는 솔루션을 지정하면 해결 방법이 있습니다. 특정 작업을 수행하는 방법에는 여러 가지가 있습니다. 나는 그것이 (특정 질문을 고려하면) run as background and never die많은 사람들 에게 탁월한 특정 임무를 달성하고 있다고 생각합니다 . 또한 사용자가 다시 상호 작용하고 원하는 경우 변경할 수 있도록 추가 보너스가 있습니다. 핵심은 구성 요소 backgroundnever die입니다. 모든 솔루션에는 특정 보너스가 있습니다.
LD James

@Rakshith Ravi-동의하지 않습니다. 이들 모두는 추가 다운로드 / 소프트웨어 / 도구를 필요로합니다 (솔루션이 제공되지 않은 init 솔루션 제외). 는 nohup 것입니다 솔루션. 그것은 리눅스에 구워졌으며 거기에 있습니다. 한 줄이고 깨끗하며 업데이트에 관계없이 항상 의도 한대로 작동합니다. 사람들은 이와 같은 기본적인 사용 사례에 타사 도구를 사용하지 않도록 노력해야합니다. 예를 들어 도커 예제는 최상위 투표 답변의 간단한 명령보다 훨씬 장황하고 리소스가 많이 사용됩니다. Docker를 좋아하지만 이것으로는 아닙니다.
Jack_Hu

1
@ Jack_Hu, 나는 오버 헤드에 대해 의심의 여지가 없지만 nohup솔루션은 "절대로 죽지 않는다"요구 사항을 충족시키지 못합니다. 매우 까다 롭 trap거나 해킹 된 무한 루프를 작성하지 않으면이 목적을 위해 특별히 작성된 도구 (또는 직접 작성한 init 스크립트)를 사용하지 않고 프로세스를 데몬 상태로 유지하는 방법을 알 수 없습니다.
Victor Schröder

24

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

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

disown은 내가 찾던 것과 정확히 같지만 -h 플래그는 무엇을합니까? 매뉴얼에서 찾을 수 없습니다
Rimantas Jacikevicius

매뉴얼 페이지에서 : -h 옵션이 제공되면 각 작업 스펙이 테이블에서 제거되지 않지만 쉘이 SIGHUP을 수신 할 때 SIGHUP이 작업으로 전송되지 않도록 표시됩니다. jobspec이 제공되지 않으면 -a 옵션은 모든 작업을 제거하거나 표시하는 것을 의미합니다.
myururdurmaz

14

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

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

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


7

@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"

7

Nohup과 화면은 백그라운드에서 Node.js를 실행하기위한 훌륭한 조명 솔루션을 제공합니다. Node.js 프로세스 관리자 ( PM2 )는 편리한 배포 도구입니다. 시스템에 npm을 사용하여 전체적으로 설치하십시오.

npm install pm2 -g

Node.js 앱을 데몬으로 실행하려면

pm2 start app.js

선택적 으로 Unitech에서 만든 모니터링 SAAS 를 Keymetrics.io에 연결할 수 있습니다 .


6
$ disown node server.js &

활성 작업 목록에서 명령을 제거하고 명령을 백그라운드로 보냅니다.



3

sysv init를 사용하여 debian에서 시스템 서비스로 명령을 실행하려면 다음을 수행하십시오.

스켈레톤 스크립트를 복사하여 필요에 맞게 조정하십시오. 아마도 변수를 설정하기 만하면됩니다. /lib/init/init-d-script필요에 맞지 않는 스크립트는에서 기본값을 상속받습니다 . 스크립트에서 무시하십시오. 문제가 발생하면 source에서 세부 사항을 볼 수 있습니다 /lib/init/init-d-script. 필수 변수는 DAEMONNAME입니다. 스크립트는 사용할 추가 매개 변수를 정의 할 수 start-stop-daemon있는 명령을 실행 START_ARGS하는 start-stop-daemon데 사용됩니다.

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

그것이 내 위키 미디어 위키에 대해 파이썬을 실행하는 방법입니다.

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

do_stop_cmdpython이 실행 파일 을 대체 하기 때문에 vars를 재정의해야 했으므로 서비스가 제대로 중지되지 않았습니다.


3

위의 멋진 솔루션 외에도 프로세스를 시작하고 존재를 모니터링하고 죽었을 때 시작할 수있는 감독자 및 감시 도구에 대해서도 언급했습니다. 'monit'을 사용하면 프로세스가 http 요청에 응답하는지 확인과 같은 일부 활성 검사를 실행할 수도 있습니다.


3

우분투의 경우 다음을 사용하십시오.

(exec PROG_SH &> / dev / null &)

문안 인사


사소한 점 : PROG_SH가 실행 파일이면 'exec'가 필요하지 않습니다. David가 제안한 솔루션의 요점은 현재 실행중인 쉘에서 아이를 분리하는 것입니다. 자녀의 부모는 'pid 1'이되고 쉘이 종료 될 때 영향을받지 않습니다.
SoloPilot

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.