시스템 재시작시 영원히 자동으로 시작 (노드)


190

노드의 영구 모듈을 사용하여 노드 서버를 계속 실행 중입니다. 그러나 시스템을 다시 시작하면 영원히 종료됩니다. 시스템이 다시 시작될 때 노드 서버를 자동으로 시작할 수있는 방법이 있습니까?


1
이 서버가 클라우드에 있습니까? 부팅 스크립트가 있습니까?
Jorge Aranda

6
체크 아웃 PM2 ! 또한 시작 스크립트 생성 (systemd, systemv ...)을 지원합니다. pm2.keymetrics.io/docs/usage/startup
Unitech

답변:


343

crontab을 사용하는 것이 좋습니다. 사용하기 쉽습니다.

어떻게

  1. 편집을 시작하려면 다음을 실행하여 "testuser"를 노드 프로세스의 원하는 런타임 사용자로 바꾸십시오. 자신 이외의 다른 사용자를 선택하는 경우 sudo를 사용하여이를 실행해야합니다.

    $ crontab -u testuser -e
  2. 이전에이 작업을 수행 한 적이 없다면 편집 할 편집기를 묻습니다. 나는 vim을 좋아하지만 사용하기 쉽도록 nano를 권장합니다.

  3. 편집기에서 다음 행을 추가하십시오.

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
  4. 파일을 저장하십시오. cron이 설치되었다는 피드백을 받아야합니다.

  5. cron 설치에 대한 추가 확인을 위해 다음을 실행하여 ( "testuser"를 대상 사용자 이름으로 다시 대체) 현재 설치된 크론을 나열하십시오.

    $ crontab -u testuser -l 

내 의견으로는 cron에서 바이너리를 실행할 때 항상 전체 경로를 사용해야한다는 점에 유의하십시오. 또한 영원한 스크립트 경로가 올바르지 않으면 which forever전체 경로를 얻기 위해 실행하십시오 .

해당 forever호출이 주어지면 다음에 node대한 전체 경로를 제공 할 수도 있습니다 node.

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

추가 자료


2
이 방법은 좋지만 시스템이 재부팅되는 경우에만 적합합니다. 서버가 종료 된 후 전원이 켜진 경우이 크론 작업이 실행되지 않습니다.
ecdeveloper

6
왜 그렇게 생각하니? en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions@reboot cron이 cron deamon 시작시 실행 된다고 설명합니다 . 덧붙여서 나는 설정된 cron이 @reboot시스템 부팅시 실행되지 않는다고 제안하는 상황을 결코 보지 못했습니다 . 종료하는 방법은 이와 관련이 없습니다.
Julian Lannigan

16
그것은 나타납니다 /home이의 경우 코드의 삶을 작동하지 않도록, 아직 설치되지 않았습니다 /home.
chovy

6
cron이 -c 옵션을 사용해도 영원히 실행하려고 할 때 노드가 경로에 없기 때문에 위의 방법이 실패했습니다. 그러나 PATH = 문을 schedule 문 위에있는 한 crontab에 직접 추가 할 수 있습니다. PATH가 설정되면 @reboot 문은 꿈처럼 작동했습니다.
YorkshireKev

2
귀하의 의견 @chovy에 감사드립니다. 매우 도움이되었습니다. bashrc의 환경 변수를 사용하는 사람들은 그의 의견을 염두에 두십시오. / home이 마운트되어 있지 않으므로 작동하지 않습니다. crontab 명령에서 변수를 다음과 같이 설정하십시오.@reboot varname=value ...
lsborg

123

이를 위해 영구 서비스를 사용할 수 있습니다.

npm install -g forever-service
forever-service install test

이것은 현재 디렉토리에 app.js를 영원히 통해 서비스로 제공합니다. 시스템을 다시 시작할 때마다 서비스가 자동으로 다시 시작됩니다. 또한 중지되면 정상적으로 중지를 시도합니다. 이 스크립트는 logrotate 스크립트도 제공합니다.

깃 허브 URL : https://github.com/zapty/forever-service

참고 : 나는 영원한 서비스의 저자입니다.


2
-e "PORT = 80 ENV = prod FOO = bar"옵션 사용
arva

2
나는 영원한 서비스를 실행하는 방법을 얻지 못한다. "영구 서비스 설치 테스트"에서 "테스트"는 무엇입니까? 내 앱을 영원히 시작하는 명령은 "/ usr / local / bin / forever start -c / usr / local / bin / node / home / alex / public / node_modules / http-server / bin / http-server -s- d 거짓 ". 무엇을 써야합니까?
Alex

3
테스트는 서비스 이름입니다. 영구 서비스 설치 테스트를 실행하면 test라는 서비스가 생성되어 해당 디렉토리에서 app.js를 실행하여 서비스로 실행됩니다. gihub 페이지의 도움말 문서를 읽고 이해할 수 없으면 문제를 추가하십시오.
arva

6
예에서 forever-service install test, @Alex-arva의 설명을 명확히하기 위해 test, 서비스 의 이름이 될 것이지만 실행할 실제 프로그램 / 노드 .js 파일의 이름은 아닙니다. 기본적으로 프로그램 이름은이라고 가정 app.js하지만 --script다음과 같이 플래그로 이를 대체 할 수 있습니다 forever-service install test --script main.js. (테스트되지 않았으므로 구문 세부 정보가 잘못된 경우 수정하십시오.)
Dan

3
@DanNissenbaum 답변 주셔서 감사합니다. 나는 이제 아름답게 작동하는 PM2를 사용하고 있습니다. 지침 : digitalocean.com/community/tutorials/…
Alex

26
  1. NPM을 사용하여 PM2를 전체적으로 설치

    npm install pm2 -g

  2. pm2로 스크립트 시작

    pm2 start app.js

  3. 활성 시작 스크립트 생성

    pm2 startup

    참고 : pm2 시작은 시스템이 재부팅 될 때 PM2를 시작하기위한 것입니다. PM2가 시작되면 시스템이 다운되기 전에 관리했던 모든 프로세스를 다시 시작합니다.

자동 시작을 비활성화하려면 pm2 unstartup을 사용하십시오.

다른 사용자가 시작 스크립트를 실행하려면 -u <username>옵션과--hp <user_home>:


여러 질문에 동일한 답변 을 게시하지 마십시오 .
FelixSFD 2012 년

나는 pm2가 어떻게 세련되고 멋진 모니터링 도구와 함께 제공되는 것을 정말 좋아합니다. 이것이 다른 사람들에게 더 강조되기를 바랍니다. @ rv7 이것을 보았지만 Windows 솔루션이 있습니다 : npmjs.com/package/pm2-windows-service . 그래도 직접 시도하지 않았습니다.
John Lee

26

이 경우는 데비안에서 유효합니다.

에 다음을 추가하십시오 /etc/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

  • {{user}} 사용자 이름을 바꿉니다.
  • {{app path}}앱 경로를 대체합니다. 예를 들어/var/www/test/app.js

2
이 방법은 정상적인 종료를 처리하지 않지만 많은 사람들에게는 이것이 문제가되지는 않습니다.
UpTheCreek

6
BTW – 편집 /etc/rc.local하지 말아야한다고 생각합니다/etc/init.d/rc.local
UpTheCreek

@UpTheCreek에 동의하면 /etc/rc.local이 이것을 추가하기에 더 적합한 장소입니다. 자세한 설명은 unix.stackexchange.com/a/59945 를 참조하십시오 .
So Over It

2
또한, 당신의 '현재 작업 디렉토리'를 지정 할 수 있습니다 app.js올바르게로드 관련 파일을 보장하기를 - process.chdir('/your/path/to/your/app'); Node.js를 심판 문서 여기에
그래서 이상이

1
Node.JS 스크립트에 환경 변수를 설정해야하는 경우 (예 : $ PORT) Express를 위해 다음 줄을 추가하여 /etc/rc.local나를 위해 속임수를 ( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )

11

답변 과이 블로그 게시물에서 영감을 얻은 대체 crontab 방법 .

1. bash 스크립트 파일을 작성하십시오 (bob을 원하는 사용자로 변경하십시오).

vi /home/bob/node_server_init.sh

2. 방금 만든 파일에 복사하여 붙여 넣습니다.

#!/bin/sh

export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null

설정에 따라 위의 경로를 편집하십시오!

3. bash 스크립트를 실행할 수 있는지 확인하십시오.

chmod 700 /home/bob/node_server_init.sh

4. bash 스크립트를 테스트하십시오.

sh /home/bob/node_server_init.sh

5. "bob"을 노드의 런타임 사용자로 바꾸십시오.

crontab -u bob -e

6. 복사하여 붙여 넣기 (밥을 원하는 사용자로 변경).

@reboot /bin/sh /home/bob/node_server_init.sh

crontab을 저장하십시오.

당신은 그것을 끝냈습니다, 당신의상은 재부팅 (테스트) :)


이 방법은 저에게 가장 효과적이었습니다. server.js 파일의 전체 경로를 넣으면 영원히 종료됩니다. 같은 디렉토리에서 실행하면 이전 버전이 정상적으로 작동합니다. 실패한 이유는 server.js 파일에 다른 파일이 포함되어 있었지만 경로가 엉망이 되었기 때문입니다. 이 방법을 사용하여 .sh 스크립트로 CD를 디렉토리에 넣은 다음 그와 관련된 모든 것을 실행할 수 있습니다.
BeardedGeek

9

첨부 된 질문 에서 답변을 복사했습니다 .

내장 된로드 밸런서가있는 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]

시스템 부팅시 어떻게 자동 으로 시작 됩니까? CLI 수동 입력 복사 / 붙여 넣기
Green

@Green, Run, $pm2 startup그 후 pm2가 수동으로 명령을 실행하고 복사하여 실행하도록 요청하는 것을 보게됩니다. 그러면 $pm2 saveapp.js는 시스템 재부팅
후에도

7

/etc/init.d 폴더에 쉘 스크립트를 작성해야합니다. init.d 스크립트의 웹에는 많은 정보가 있지만 복잡하지 않습니다.

다음은 CoffeeScript 사이트를 영원히 실행하기 위해 만든 스크립트 샘플입니다.

#!/bin/bash
#
# initd-example      Node init.d 
#
# chkconfig: 345 
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid 
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#


# Source function library.
. /lib/lsb/init-functions


pidFile=/var/run/forever-initd-hectorcorrea.pid 
logFile=/var/run/forever-initd-hectorcorrea.log 

sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile


start() {
    echo "Starting $scriptId"

    # This is found in the library referenced at the top of the script
    start_daemon

    # Start our CoffeeScript app through forever
    # Notice that we change the PATH because on reboot
    # the PATH does not include the path to node.
    # Launching forever or coffee with a full path
    # does not work unless we set the PATH.
    cd $sourceDir
    PATH=/usr/local/bin:$PATH
    NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile

    RETVAL=$?
}

restart() {
    echo -n "Restarting $scriptId"
    /usr/local/bin/forever restart $scriptId
    RETVAL=$?
}

stop() {
    echo -n "Shutting down $scriptId"
    /usr/local/bin/forever stop $scriptId
    RETVAL=$?
}

status() {
    echo -n "Status $scriptId"
    /usr/local/bin/forever list
    RETVAL=$?
}


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $RETVAL

init.d 스크립트가 루트로 실행되었으므로 폴더와 PATH가 루트 사용자에게 명시 적으로 설정되거나 사용 가능한지 확인해야했습니다.


2
init.d로 시작된 종속성이 있으면로드 순서 문제가있을 수 있습니다.
UpTheCreek

@ alexandru.topliceanu 링크를 수정했습니다.
헥터 코레아

6

PM2 사용

서버 프로덕션 서버를 실행하는 가장 좋은 옵션은 무엇입니까

이런 식으로 응용 프로그램을 실행하면 어떤 이점이 있습니까?

  • 충돌이 발생하면 PM2가 자동으로 응용 프로그램을 다시 시작합니다.

  • PM2는 처리되지 않은 예외에 대한 로그 (이 경우 /home/safeuser/.pm2/logs/app-err.log의 파일)를 보관합니다.

  • PM2는 하나의 명령으로 서버가 재부팅 될 때 관리하는 모든 응용 프로그램이 다시 시작되도록 할 수 있습니다. 기본적으로 노드 응용 프로그램은 서비스로 시작됩니다.

심판 : https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps


5

노드 응용 프로그램을 서비스로 실행하도록 만들지 않았습니다. 올바른 접근 방식은 / etc / inittab 항목 (이전 Linux 시스템) 또는 시작 (새로운 Linux 시스템)을 작성하는 것입니다.

다음을 시작으로 설정하는 방법에 대한 문서가 있습니다. https://github.com/cvee/node-upstart


Upstart가 CentOS에서 실패했고 사라질 것이라는 것을 읽었습니다. init.d 엔트리를 생성하는 것은 실제로 가장 사용자 친화적 인 방법은 아니지만 리눅스라고 생각합니다 :)
Jorre

5

crontabCentOS x86 6.5에서 작동하지 않습니다. @reboot가 작동하지 않는 것 같습니다.

마지막 으로이 솔루션을 얻었습니다.

편집하다: /etc/rc.local

sudo vi /etc/rc.local

이 줄을 파일 끝에 추가하십시오. 변경 USER_NAMEPATH_TO_PROJECT자신에. NODE_ENV=production앱이 프로덕션 모드에서 실행됨을 의미합니다. 하나 이상의 node.js 앱을 실행해야하는 경우 더 많은 라인을 추가 할 수 있습니다.

su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"

NODE_ENV별도의 줄에 설정하지 마십시오. 앱은 계속 개발 모드에서 실행됩니다 NODE_ENV.

# WRONG!
su - USER_NAME -c "export NODE_ENV=production"

vi 저장 후 종료 ESC : w q return ). 서버를 재부팅 할 수 있습니다. 서버가 재부팅되면 ssh를 통해 원격으로 계정에 로그인하지 않아도 node.js 앱이 자동으로 실행됩니다.

NODE_ENV쉘에 환경을 설정하는 것이 좋습니다 . NODE_ENV계정이 USER_NAME로그인 하면 자동으로 설정됩니다 .

echo export NODE_ENV=production >> ~/.bash_profile

따라서 다시 /PATH_TO_PROJECT/app.js설정하지 않고 ssh를 통해 영구 중지 / 시작과 같은 명령을 실행할 수 있습니다 NODE_ENV.


데비안 7.6에서 같은 문제가 발생했습니다. 이것은 나를 위해 수정되었습니다. 많은 감사합니다.
Daniele Vrut

'영원히'를 사용하지 않으려는 경우 줄을 'su-USER_NAME -c "NODE_ENV = 생산 노드 / PATH_TO_PROJECT / bin / www"'로 변경할 수 있습니다.
yaobin

3

나는 정확하게 이것을하는 스크립트를 썼다 :

https://github.com/chovy/node-startup

나는 영원히 시도하지 않았지만 실행하는 명령을 사용자 정의 할 수 있으므로 간단해야합니다.

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop

1

위의 답변을 많이 시도했습니다. 그들 중 누구도 나를 위해 일하지 않았습니다. 내 앱은 /home루트가 아닌 사용자로 설치됩니다 . 이것은 위에서 언급 한 시작 스크립트가 실행될 때/home 아직 마운트되지 않았으므로 앱이 시작되지 않았 음을 의미합니다.

그런 다음 Digital Ocean에서 다음 지침을 찾았습니다.

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

설명 된대로 PM2를 사용하는 것은 매우 간단하고 완벽하게 작동합니다. 내 가상 서버에는 두 번의 물리적 충돌이 있었으므로 중단 시간은 약 1 분이었습니다.


PM2는 github에서 영원히보다 훨씬 많은 별 (2x)을 가지고 있으며 더 많은 기능을 가지고 있습니다. 나는 대부분의 답변이 여기에서 더 이상 사용되지 않는다고 생각합니다.
inf3rno

1

rc.local의 문제점은 사용자로 로그인하고 sudo를 사용하는 것과 다른 root로 명령에 액세스한다는 것입니다.

etc / profile.d에 시작 명령이있는 .sh 스크립트를 추가하여이 문제를 해결했습니다. profile.d의 .sh 파일은 자동으로로드되며 일반 sudo를 사용한 것처럼 모든 명령이 처리됩니다.

이것의 유일한 단점은 지정된 사용자가 내 상황에서 항상 사건을 시작하기 위해 로그인해야한다는 것입니다.


0

전체 예제 crontab (/ etc / crontab에 있음) ..

#!/bin/bash

# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l

# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

# * * * * * echo "executes once every minute" > /root/deleteme

@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;

-1

쉘에서 다음 명령을 사용하여 노드를 영원히 시작할 수 있습니다.

forever app.js //my node script

앱이 실행되는 서버는 항상 켜져 있어야합니다.

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