development

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

big-blog 2020. 2. 14. 23:46
반응형

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


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

$ node server.js &

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


편집 1

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

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


편집 2 (2012 년 2 월)

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


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

nohup node server.js &

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

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"

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

npm install pm2 -g

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

pm2 start app.js

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


$ disown node server.js &

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


nohup 명령 에 대해 읽었 습니까?


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를 재정의해야 했으므로 서비스가 제대로 중지되지 않았습니다.


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


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

(exec PROG_SH &> / dev / null &)

문안 인사


간단한 해결책을 위해 이것을 시도하십시오

cmd 및 종료

참고 : https://stackoverflow.com/questions/4797050/how-to-run-node-js-as-a-background-process-and-never-die



반응형