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 &
nohup
의미 : stty가 끊어진 경우에도이 프로세스를 종료하지 마십시오.> /dev/null
의미 : stdout은 / dev / null로 이동합니다 (출력을 기록하지 않는 더미 장치 임).2>&1
의미 : stderr도 stdout으로 이동합니다 (이미 리디렉션되었습니다/dev/null
). 오류 로그를 유지하기 위해 & 1을 파일 경로로 바꿀 수 있습니다. 예를 들면 다음과 같습니다.2>/tmp/myLog
&
마지막 의미 : 이 명령을 백그라운드 작업으로 실행하십시오.
당신은 정말로 사용하려고합니다 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
터미널이 죽은 후에도 프로그램을 계속 사용할 수 있습니다. 실제로 nohup
SSH 세션이 올바르게 종료되지 않는 상황이 있었 으므로 입력도 리디렉션해야합니다.
$ 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
. 필수 변수는 DAEMON
및 NAME
입니다. 스크립트는 사용할 추가 매개 변수를 정의 할 수 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_cmd
python이 실행 파일 을 대체 하기 때문에 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
'development' 카테고리의 다른 글
Windows의 Git Bash에서 'git diff'의 결과를 어떻게 종료합니까? (0) | 2020.02.15 |
---|---|
문자열이 null이 아니고 비어 있지 않은지 확인하십시오. (0) | 2020.02.15 |
vshost.exe 파일의 목적은 무엇입니까? (0) | 2020.02.14 |
CSS 파일에서 상대 URL을 사용하면 상대 위치는 무엇입니까? (0) | 2020.02.14 |
JavaScript 함수에서 전역 변수 정의 (0) | 2020.02.14 |