node.js 애플리케이션을 영구적으로 실행하는 방법은 무엇입니까?


259

데비안 서버에서 Node.js를 설치했습니다. 이 명령 줄을 사용하여 퍼티에서 앱을 시작하는 방법을 이해합니다.

node /srv/www/MyUserAccount/server/server.js

주소 50.51.52.53:8080(IP 및 포트)에서 확인하십시오.

그러나 퍼티를 닫으면 50.51.52.53:8080더 이상 주소에 도달 할 수 없습니다 .

Node.js 애플리케이션을 영구적으로 실행하는 방법은 무엇입니까?

짐작할 수 있듯이 Linux 및 Node.js의 초보자입니다.


7
참고 것을 PM2은 에 좋은 대안이다 영원히 , 당신이 어떤 이유로 영원히 사용하지 않은 경우.
Kevin B

감사합니다 @KevinB github.com/Unitech/pm2 는 정말 좋은 대안입니다
Sachin Chavan

답변:


220

다른 답변은 OP의 문제를 해결하지만 모두 과잉 상태이며 왜이 문제가 발생했는지 설명하지 않습니다.

열쇠는이 줄입니다. "퍼티를 닫으면 주소를 찾을 수 없습니다"

Putty에서 원격 호스트에 로그인하면 SSH Linux 프로세스를 시작했으며 해당 SSH 세션에서 입력 한 모든 명령이 해당 프로세스의 하위로 실행됩니다.

문제는 퍼티를 닫을 때 SSH 세션을 종료하여 해당 프로세스와 활성 자식 프로세스를 종료한다는 것입니다. 퍼티를 닫으면 포 그라운드 에서 서버를 실행했기 때문에 실수로 서버를 종료 합니다 . 이 동작을 피하려면 &를 명령에 추가 하여 백그라운드 에서 서버를 실행하십시오 .

node /srv/www/MyUserAccount/server/server.js &

여기서 문제는 리눅스 지식이 부족하고 노드에 대한 질문이 아닙니다. 더 자세한 정보는 http://linuxconfig.org/understanding-foreground-and-background-linux-processes에서 확인 하십시오.

최신 정보:

다른 사람들이 언급했듯이, 노드 서버는 터미널을 나갈 때 여전히 죽을 수 있습니다. 내가 겪었던 공통점은 노드 프로세스가 bg에서 실행 되더라도 stdout이고 stderr이 여전히 터미널을 가리키고 있다는 것입니다. 이는 노드 서버가 console.log 또는 console.error에 쓰면 파이프 오류 및 충돌이 발생 함을 의미합니다. 프로세스의 출력을 파이핑하여 피할 수 있습니다.

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

문제가 지속되면 모든 유형의 프로세스 (데이터베이스, 로깅 서비스, 기타 언어)를 실행하는 데 사용할 수 있기 때문에 노드 특정 솔루션보다 훨씬 강력한 tmux 또는 nohup 과 같은 것을 조사해야합니다 .

서버를 종료시킬 수있는 일반적인 실수는 실행 후 nohup node your_path/server.js &간단히 클릭만으로 퍼티 터미널을 닫는 것입니다. exit대신 명령 을 사용해야 합니다. 그러면 노드 서버가 시작되어 실행됩니다.


7
퍼티 세션을 &닫으면 서비스 를 수행 하는 동안 여전히 닫힙니다. (그냥 데비안 제시 테스트)
닉 뉴먼에게

1
@NiCkNewman이 말했듯 이이 답변은 불완전합니다! 올바른 해결책 은 Rick Roy의 답변 을 참조하십시오 .
thejonwithnoh

19
"&"를 사용하면 프로세스가 백그라운드에서 실행되지만 실제로는이 명령의 시작 부분에 "nohup"을 추가하여 콘솔 창에서 분리하여 응용 프로그램이 몇 초 후에 잠자기 상태가 될 때 중지되지 않도록해야합니다. 시간, 이전에 언급 한 명령을 다음과 같이 수정합니다.nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX 전원 시스템, nohup node myApp.js &bg에서 앱을 실행했지만 용어가 닫히면 죽습니다. 왜 그런지 잘 모르겠습니다.
AnBisw

4
@Annjawn, 당신은 exit터미널을 종료 명령을 사용해야 합니다.
Ionut Necula

342

다음 과 같이 npm을 사용하여 영원히 설치할 수 있습니다 .

sudo npm install -g forever

그런 다음 응용 프로그램을 시작하십시오.

forever server.js

또는 서비스로 :

forever start server.js

어떤 이유로 든 앱이 충돌하거나 중지되면 앱을 다시 시작합니다. 재시작을 5로 제한하려면 다음을 사용할 수 있습니다.

forever -m5 server.js

실행중인 모든 프로세스를 나열하려면

forever list

괄호 안의 정수를 기록하고 다음과 같이 사용하여 프로세스를 중지하십시오.

forever stop 0

실행중인 프로세스를 다시 시작하면 다음과 같습니다.

forever restart 0

애플리케이션 파일에서 작업중인 경우 파일이 변경 -w될 때마다 매개 변수를 사용하여 자동으로 다시 시작할 수 있습니다 server.js.

forever -w server.js

11
ssh 세션 / 창이 닫힐 때 @MarthaJames가 닫히면 "시작"을 포함하지 않은 것 같습니다.forever start <file>
Kristian

8
사용 forever server.jsforever start server.js? 의 차이점은 무엇입니까 ? 나는 그것이 "서비스로서"라고 말하지만 그것이 무엇을 의미합니까?
Marquizzo

5
에 입력 forever server.js하면 서버가 시작됩니다. Ctrl+를 누르면 C서비스가 중지됩니다. 입력 forever start server.js하면 서비스가 시작되고 Ctrl+를 눌러도 C열린 상태로 유지됩니다. 그런 다음 위의 다른 참조 명령을 수행하여 목록을 중지 / 볼 수 있습니다. 그게 적어도 내가 경험 한 것입니다.
Termato

6
서버를 다시 시작한 후 스크립트가 시작됩니까?
beingalex

1
forever모듈 (v0.15.3)가 서비스 공격의 정규 표현식 거부에 취약하고 사용하지 않아야합니다 : github.com/foreverjs/forever/issues/960
베니 노이게 바우어

82

내장 된로드 밸런서가있는 Node.js 애플리케이션의 프로덕션 프로세스 관리자 인 PM2 를 사용할 수 있습니다 .

PM2 설치

$ npm install pm2 -g

응용 프로그램 시작

$ pm2 start app.js

express를 사용하면 다음과 같이 앱을 시작할 수 있습니다

pm2 start ./bin/www --name="app"

실행중인 모든 프로세스 나열 :

$ pm2 list

모든 프로세스를 나열합니다. 그런 다음 다음 명령으로 앱의 ID 또는 이름을 사용하여 서비스를 중지 / 다시 시작할 수 있습니다.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

로그를 표시하려면

$ pm2 logs ['all'|app_name|app_id]

1
하나님의 축복이 있기를! 효과가있다!! Forever와 Nohup은 아마존 웹 서비스 bitnami nodejs 서버 ( docs.bitnami.com/aws/infrastructure/nodejs ) 에서 작동하지 않습니다 . PM2는 훌륭하게 작동합니다!
polras

이 라이브러리는 github에서 가장 많이 시작한 것으로 보입니다
DragonFire

41

충돌이 발생했을 때 노드를 다시 시작 하고 Forever 와 같은 것을 처리하는 Forever 와 같은 것을 찾는 것이 좋습니다 .


nohup이 방법으로 실행하면 ssh 세션을 종료하면 node 없이 종료됩니다 (screenux와 같은 것을 tmux에 사용하지 않는 한).
Haozhun

1
@Haozhun, 흥미롭지 만, 그것이 내 컴퓨터에서 저에게 효과가 없었습니다. 이 명령을 사용하여 ssh in하고 무언가를 시작하면 SSH 세션을 닫은 후에도 백그라운드에서 영원히 실행됩니다.
Brad

@Brad stackoverflow.com/questions/4018154/… 의 두 번째 답변을 참조하십시오 . 일부 사람들은이 질문에 대한 첫 번째 의견에 동의하는 것으로 보입니다 nohup. 이 혼란을 해결할 수 있다면 좋을 것입니다. 그러나 어디서부터 시작해야할지 모르겠습니다.
Haozhun

4
대부분의 유닉스 (Linux의 대부분의 배포판 포함)의 경우 백그라운드에서 항목을 실행하면 터미널 창을 닫아도 프로세스가 종료됩니다. 이를 방지하려면로 실행하십시오 nohup. 예 :nohup node app.js &
slebetman

1
프로덕션 Linux 환경에서 Forever를 사용합니다. 나는 일반적으로 영원히 --minUptime 10000 -o /logs/myapp.log nodeApp.js 시작 명령을 사용하여
mbokil

36

터미널에서 항상 노드 앱을 실행하려면 화면을 사용하십시오.

우분투 / 데비안에 설치하십시오 :

sudo apt-get install screen

용법:

$ screen
$ node /path/to/app.js

ctrl + a다음 ctrl + d기각하기

돌아 오려면 :

한 화면 : screen -r

둘 이상이 있으면 다음과 같이 모든 화면을 나열 할 수 있습니다. screen -ls

그리고: screen -r pid_number


1
이 방법은 언제든지 프로세스를 포 그라운드로 전환 할 수있는 좋은 옵션입니다.
aexl

26

당신은 단순히 이것을 사용할 수 있습니다

nohup node /srv/www/MyUserAccount/server/server.js &

이렇게하면 응용 프로그램이 계속 실행되고 종료되므로 응용 프로그램을 종료해야합니다.

이를 위해 설치 htop하고 노드를 검색 한 다음 종료 할 수 있습니다


18
이 경우 사용자는 PuTTY 세션을 올바르게 종료해야합니다 (예 : exit명령을 통해 ). 사용자가 단순히 창을 닫으면 SIGHUP프로세스를 끝내기 위해 다른 신호를 사용할 수 있으므로 노드가 종료됩니다.
thejonwithnoh

1
문제에 대한 간단한 다목적 Linux 솔루션 인 경우 +1. 이것은 DogNibbler의 답변 보다 낫습니다 .
thejonwithnoh

@thejonwithnoh 귀하의 의견을 읽은 후 퍼티를 갑자기 닫으려고 시도했지만 서버가 여전히 작동했습니다. 아마도 env 구성 방법과 관련이 있었을 것입니다. 하지만 난 영업 이익을 달성하는 간단한 방법이 될 것입니다이 요청이 있었는지에 대한 생각
릭 로이을

나는이 간단한 접근 방식을 좋아합니다.이를 죽이는 것처럼 가장 쉬운 방법은 killall node모든 노드 프로세스를 죽일 것입니다.
Nelson

@Nelson 여러 개의 스크립트가 실행 중이고 하나의 특정 스크립트 만 종료하려는 경우 모든 노드 프로세스를 종료시키는 것입니다. 프로세스를 찾은 다음 프로덕션 서버에서 여러 개의 노드 프로세스가 실행되는 경우 해당 프로세스를 종료하는 것이 좋습니다. 악몽을 느끼고 싶지 않아 : D
Rick Roy

12

영원히 그렇게하는 아주 좋은 NodeJs 모듈입니다.

forever명령 행에 입력하여 설치

$ npm install forever -g

그런 다음 다음 명령을 사용하여 node.js 스크립트를 실행하십시오.

$ forever start /path/to/script.js

잘 가세요 또한 당신은 실행할 수 있습니다

$ forever list

실행중인 모든 스크립트를 볼 수 있습니다. 다음을 입력하여 특정 스크립트를 종료 할 수 있습니다

$ forever stop [pid]

명령 [pid]에서 얻을 스크립트의 프로세스 ID는 어디에 있습니까 list? 모든 스크립트를 중지하려면 다음을 입력하십시오.

$ forever stopall

10

nohup working AWS Ubunto VM 에서 체크인했습니다.syntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

그런 다음 Enter 키를 누르면이 줄이 표시됩니다

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

그런 다음 이것을 입력하십시오

rm nohup.out

여기에 이미지 설명을 입력하십시오


3
작은 bash 프롬프트에서 호스트 이름을 지우는 방법이 마음에 들지만 창 제목의 큰 제목에는 그대로 두었습니다.
conny

10

설치

$ [sudo] npm install forever -g

영원히 사용하여 스크립트를 지속적으로 실행할 수 있습니다

forever start server.js

forever list

서비스 중지

forever stop server.js

9

개인 프로젝트에 사용하고 있는 신생 솔루션 은 다음과 같습니다 .

그것을 배치하십시오 /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

또한 응용 프로그램이 충돌하는 경우 응용 프로그램 다시 생성을 처리합니다. 15 초 이내에 3 번 이상 충돌하면 응용 프로그램을 다시 생성하려는 시도를 포기합니다.


9

개발 중에 nodemon을 사용하는 것이 좋습니다 . 파일이 변경 될 때마다 서버를 다시 시작합니다. 다른 사람들이 지적했듯이 Forever 는 옵션이지만 프로덕션 환경에서는 모두 사용중인 플랫폼에 따라 다릅니다. 일반적으로 운영 체제에서 권장하는 서비스 유지 방법 (예 : http://www.freedesktop.org/wiki/Software/systemd/ ) 을 사용하려고합니다 .


이것은 MEAN.JS 응용 프로그램에서 나를 위해 일했습니다- nodemon서버 JS 파일을 지정하지 않으면 grunt 명령을 실행하므로 mongo 와 node를 영원히 / 동시에 실행하기 위해 이것을 사용하고 있습니다.
J-Dizzle

8

나는 일을 완벽하게 훌륭하게 수행하는 것을 영원히 발견했습니다.

이미 npm이 설치되어 있다고 가정하면 설치하지 않은 경우

sudo apt-get install npm

그런 다음 영원히 설치

npm install forever --global

이제 이렇게 실행할 수 있습니다

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g 영구 삭제
DragonFire


5

다른 방법은 앱의 시스템 단위를 만드는 것입니다. "/ etc / systemd / system"폴더에 "XXX.service"파일을 다음과 유사하게 만듭니다.

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

이점은 앱이 서비스로 실행되며 충돌하면 자동으로 다시 시작된다는 것입니다.

sytemctl을 사용하여 관리 할 수도 있습니다.

systemctl start XXX서비스를 시작하고 systemctl stop XXX중지하고 systemctl enable XXX시스템 부팅시 앱을 자동으로 시작합니다.


4

이것이 도움이되기를 바랍니다.

명령 행에서 영원히 설치하십시오.

npm install forever -g

예제 파일을 작성하십시오.

sudo nano server.js 

파일을 편집하고 브라우저에서 직접 결과를 얻을 수 있습니다.
filezilla 또는 편집기를 사용하여 파일을 편집 할 수 있습니다. 이 명령을 실행하여 파일을 실행하십시오.

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

여기에 이미지 설명을 입력하십시오


3

다른 패키지를 설치할 필요가 없습니다.

이 명령을 실행

node server.js > stdout.txt 2> stderr.txt &

server.js 는 서버 파일이거나 api.js 일 수 있습니다 .

그 후 " exit "를 누르면 터미널이 닫힙니다.

exit


0

영원히 나를 위해 일한 패키지 한 가지, 그것은에 따라 깊은 동일한 당신처럼 설치와 함께 문제를 가지고 그렇게하는 경우 :

npm -g install forever

시험:

npm -g install forever deep-equal@1.1.1

대신에.

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