source

Node.js를 백그라운드 프로세스로 실행하고 절대 죽지 않는 방법은 무엇입니까?

manycodes 2023. 5. 21. 11:40
반응형

Node.js를 백그라운드 프로세스로 실행하고 절대 죽지 않는 방법은 무엇입니까?

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

$ node server.js &

그러나 2.5시간 후에는 터미널이 비활성화되고 프로세스가 중단됩니다.단말기를 분리한 상태에서도 공정을 유지할 수 있는 방법이 있습니까?


편집 1

사실 저는 노력했습니다.nohup하지만 Putty SSH 터미널을 닫거나 인터넷 플러그를 뽑자마자 서버 프로세스가 즉시 중지됩니다.

퍼티에서 제가 해야 할 일이 있나요?


편집 2 (2012년 2월)

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

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

  1. nohupmeans: stty가 차단된 경우에도 이 프로세스를 종료하지 마십시오.
  2. > /dev/null평균: stdout은 /dev/dev(출력을 기록하지 않는 더미 장치)로 이동합니다.
  3. 2>&1즉, stderr은 stdout(이미 리디렉션됨)으로도 이동합니다. &1을 파일 경로로 대체하여 오류 로그를 보관할 수 있습니다. 예: 2>/tmp/myLog
  4. &마지막은 백그라운드 작업으로 이 명령을 실행하는 것을(를 의미합니다.

간단한 솔루션(프로세스로 돌아갈 생각이 없다면 프로세스를 계속 실행하기만 하면 됩니다):

nohup node server.js &

jobs명령을 사용하여 백그라운드 프로세스의 인덱싱된 목록을 확인할 수 있습니다.실행하면 백그라운드 프로세스를 종료할 수 있습니다.kill %1또는kill %2숫자는 공정의 인덱스입니다.

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

screen

다음 d한 다음 Ctrl+a+d 키를 눌러 할 수 .screen -r

화면에 대한 새로운 대안인 tmux도 고려해 보십시오.

당신은 정말로 사용하려고 노력해야 합니다.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를 누릅니다.완료. 세션은 백그라운드에서 계속 진행됩니다.

다음 기준으로 모든 세션을 나열할 수 있습니다.screen -ls그리고 일부에 첨부합니다.screen -r 20673.pts-0.srv명령입니다. 여기서 0673.pts-0.srv는 항목 목록입니다.

이것은 오래된 질문이지만 구글에서 높은 순위를 차지하고 있습니다.하고 node.js 노드를 사용하기 때문에 이 가장 높은 수 .&또는 심지어 그것과 함께.nohup플래그(모두)는 해결 방법일 뿐입니다.

특히 스크린/tmux 솔루션은 아마추어 솔루션으로 간주되어야 합니다.화면과 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]

에▁where디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 이벤트에 의해 트리거된 간단한 셸 스크립트입니다.자세한 내용은 여기를 참조하십시오.

도커:

서버를 Docker 컨테이너에서 실행하기만 하면 됩니다.-d옵션과 voila, 당신은 데몬화된 node.js 서버를 가지고 있습니다!

다음은 샘플 도커 파일(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터미널이 종료된 후에도 프로그램을 계속 진행할 수 있습니다.저는 실제로 이런 상황을 겪었습니다.nohup되지 않도록 . "SSH " " " SSH " "라는 메시지가 표시됩니다.

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

nohup이 구성되어 있으므로 표준 출력 및 표준 오류를 파일로 리디렉션해야 할 수도 있습니다.

Noup과 화면은 백그라운드에서 Node.js를 실행할 수 있는 훌륭한 조명 솔루션을 제공합니다.PM2(Node.js process manager)는 배포에 유용한 도구입니다.시스템에 전체적으로 npm과 함께 설치합니다.

npm install pm2 -g

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

pm2 start app.js

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

$ disown node server.js &

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

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

당신은 노업 명령에 대해 읽어본 적이 있습니까?

sysv init를 사용하여 debian에서 시스템 서비스로 명령을 실행하는 방법

스켈레톤 스크립트를 복사하여 필요에 맞게 조정합니다. 아마도 몇 가지 변수를 설정하기만 하면 됩니다.스크립트가 다음에서 세부 기본값을 상속합니다./lib/init/init-d-script필요에 맞지 않는 항목이 있는 경우 스크립트에서 재정의합니다.문제가 발생하면 소스에서 세부 정보를 볼 수 있습니다./lib/init/init-d-script는 필수변수입니다.DAEMON그리고.NAME는 스립트사용을 합니다.start-stop-daemon하려면 명을실려면하에서START_ARGS의 추 매 개 있 수 니 습 다 정 할 의 변 가 를 수 ▁of ▁addition ▁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이 실행 파일을 대체하기 때문에 서비스가 제대로 중지되지 않았습니다.

위의 멋진 솔루션 외에도 프로세스를 시작하고, 프로세스의 존재를 모니터링하며, 프로세스가 중단된 경우 시작할 수 있는 감독자 및 모니터링 도구에 대해서도 언급하겠습니다.'monit'를 사용하면 프로세스가 http 요청에 응답하는지 확인하는 등의 몇 가지 활성 검사를 실행할 수도 있습니다.

Ubuntu의 경우 다음을 사용합니다.

(exec PROG_SH &> /dev/null &)

안부 전해요

간단한 솔루션을 사용해 보십시오.

cmd & 종료

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

반응형