백그라운드 서비스로 node.js 앱을 어떻게 실행합니까?


503

이 게시물은 수년 동안 많은 주목을 받았으므로이 게시물의 맨 아래에 플랫폼 당 최고의 솔루션을 나열했습니다.


원본 게시물 :

node.js 서버가 백그라운드에서 실행되기를 원합니다. 즉, 터미널을 닫을 때 서버가 계속 실행되기를 원합니다. 나는 이것을 봤고이 자습서를 생각해 냈지만 의도 한대로 작동하지 않습니다. 따라서 데몬 스크립트를 사용하는 대신 출력 리디렉션 ( 2>&1 >> file부분)을 사용했다고 생각 했지만 종료되지 않습니다. 출력 / 오류를 기다리는 것처럼 터미널에 빈 줄이 나타납니다.

또한 백그라운드에서 프로세스를 시도했지만 터미널을 닫 자마자 프로세스가 종료됩니다.

로컬 컴퓨터를 종료 할 때 어떻게 실행 상태로 둘 수 있습니까?


최고의 솔루션 :


3
나는 그가 자신의 로컬 시스템 종료하는 의미 생각
카말 레디

46
그는 ssh 세션을 닫으면 작업이 종료됨을 의미했습니다
thedjaney

5
github.com/Unitech/pm2 는 고도로 유지 관리되고 매우 안정적인 프로세스 관리자입니다.
Unitech

1
당신은 화면을 사용할 수 있습니다 ( aperiodic.net/screen/quick_reference )
karantan

답변:


434

에서 내 자신의 대답을 복사 나 자체 프로세스로 Node.js를 응용 프로그램을 실행하려면 어떻게합니까?

2015 년 답변 : 거의 모든 Linux 배포판에 systemd가 제공 되므로 영원히, monit, PM2 등이 더 이상 필요하지 않습니다 . OS가 이미 이러한 작업을 처리하고 있습니다.

myapp.service파일을 만드십시오 (명명하게 앱 이름으로 'myapp'로 대체) :

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

유닉스를 처음 접한다면 첫 번째 줄에 /var/www/myapp/app.js있어야 #!/usr/bin/env node합니다.

서비스 파일을에 복사하십시오 /etc/systemd/system.

로 시작하십시오 systemctl start myapp.

로 부팅시 실행되도록 설정하십시오 systemctl enable myapp.

로 로그 참조 journalctl -u myapp

이는 Linux, 2018 년 에디션 에서 노드 앱을 배포하는 방법 에서 가져온 것으로 , 여기에는 .service파일을 포함하여 Linux / 노드 서버를 빌드하기위한 AWS / DigitalOcean / Azure CloudConfig 생성 명령이 포함되어 있습니다.


4
사용 가능한 경우 Upstart도 좋은 솔루션입니다. 어느 쪽이든 nodejs 데몬을 계속 실행하기 위해 nodejs 프로세스에 의존해서는 안됩니다. 이것은 OS를위한 유일한 작업입니다. killall nodejs와 영원히 사라졌습니다 ....
131

19
사용자로서 시스템 서비스를 실행할 수도 있습니다. 예를 들어이 튜토리얼을 참조하십시오 . 서비스 파일을에 넣고 ~/.config/systemd/user시작하고로 systemctl --user start myapp활성화 할 수 있습니다 systemctl --user enable myapp.
cdauth

5
이 답변에 감사드립니다. 이것이 내가 순수하고 분명하게 원하는 것입니다
bmavus

5
나는 이것이 영원한 방법이라고 생각하기 때문에 "영원한"대신이 대답을 받아 들였습니다. Mac 및 Windows에 대한 비슷한 답변이 있지만 대다수가 Linux 솔루션을 찾고 있다고 생각합니다.
피터 Kruithof

11
EC2 AMI 경로에 / etc / systemd / system이 없습니다. AWS EC2 Linux AMI에서 올바른 경로는 무엇입니까?
René Michel

241

주어진 노드 스크립트가 지속적으로 (즉, 영원히) 실행되도록하는 간단한 CLI 도구 인 Forever를 사용할 수 있습니다. https://www.npmjs.org/package/forever


4
최신 노드에서는 스크립트 이름 (오류)을 통해 앱을 중지시킬 수 없었습니다-일반적으로 오작동 (OS-X에 있음)-모두 소스에서 이상하게 작성되었습니다. 나쁜 상태로 남겨두고 자신감을 가지지 못했습니다.
Michael Neale

4
nohup이 트릭을 수행하는 동안 프로세스를 디먼 (demonize) 할 때 영원히 더 나은 솔루션입니다. 훌륭한 도구!
피터 Kruithof

5
그냥 간단한 튜토리얼이 여기에 있습니다 : Forever와 함께 node.js 서버 유지
kehers

2
나는 영원히 Forever를 사용했지만 처음에는 모든 것이 괜찮아 보이지만 재난이 발생했습니다. 영원히는 더 이상 프로세스를 관리 할 수 ​​없었고 야생 상태로 만들 수있었습니다. 더 나은 솔루션을 찾기 위해 여전히 노력하고 있습니다. nohup을 사용하려고합니다
LN

5
Geoffrey- 아니오, forever start /path/to/yourApp.js서버 시작 스크립트에서해야합니다.
mikermcneil

215

업데이트 -아래 답변 중 하나에서 언급했듯이 PM2 에는 영원히 없어진 멋진 기능이 있습니다. 사용을 고려하십시오.

원래 답변

nohup 사용 :

nohup node server.js &

편집 나는 받아 들여진 대답이 실제로 갈 길이라고 덧붙이고 싶었다. 나는 유지 해야하는 인스턴스에서 영원히 사용하고 있습니다. npm install -g forever노드 경로에있는 것을 좋아합니다.forever start server.js


136
알아야 할 멋진 부분 : 예전의 모뎀 nohup스탠드에 전화 를 걸 no hangup때 프로세스를 계속 유지하고 싶었던 스탠드입니다 .
jAndy

1
요즘은 프로세스가 사용자 (또는 손실 모뎀 연결, 물론 : P) 쉘을 종료한다는 경고를받을 수 신호 1이 아니라 이름이다
LAPO

7
앱에 잡히지 않은 오류가 발생하면 노드 프로세스가 종료되고 다시 시작되지 않기 때문에 최상의 솔루션은 아닙니다. 그럼에도 불구하고 개발을위한 합리적인 옵션입니다.
Andy E

1
환경 변수를 어떻게 추가합니까? 예 : PORT = 80 node server.js
Pardoner


67

이것은 받아 들일 수없는 방법 일 수도 있지만, 특히 개발 중에는 필요에 따라 다시 가져 와서 바보로 만들 수 있기 때문에 화면으로 처리합니다.

screen
node myserver.js
>>CTRL-A then hit D

화면이 분리되고 로그 오프 한 후에도 유지됩니다. 그런 다음 screen -r을 다시 수행 할 수 있습니다. 자세한 내용은 화면 설명서를 누르십시오. 원하는 경우 화면의 이름을 지정할 수 있습니다.


2
또한 tmux도 좋습니다. 화면처럼 작동합니다 (CTRL-A 대신 CTRL-B가 기본값이지만 구성 가능함). Tmux에는 패널 (분할 화면)이 있습니다.
snapfractalpop

1
스크린도 패널이 있습니다
Billy Moon

유성 앱에 몇 주 이후부터 이것을 사용하고 있습니다. 분리 및 재 연결을위한`$ screen -dr '이 때때로 필요할 수 있습니다.
Vinay Vemula

나를 위해 가장 쉬운 방법은 일을 끝내는 것입니다. 그러나 최선의 해결책은 아닙니다
Pomme De Terre

이 솔루션은 시스템 재부팅 후 지속되지 않습니다
wnasich

60

2016 업데이트 : node-windows / mac / linux 시리즈는 모든 운영 체제에서 공통 API를 사용하므로 절대적으로 관련 솔루션입니다. 하나; node-linux는 systemv init 파일을 생성합니다. systemd의 인기가 계속 높아짐에 따라 Linux에서는 실제로 더 나은 옵션입니다. 누구든지 node-linux에 시스템 지원을 추가하고 싶다면 PR을 환영합니다 :-)

실 :

이것은 꽤 오래된 스레드이지만 node-windows 는 Windows에서 백그라운드 서비스를 만드는 또 다른 방법을 제공합니다. 노드 스크립트 주위 nssmexe랩퍼 를 사용한다는 개념에 기반을두고 있습니다. 하나; winsw.exe대신 사용 하고 프로세스가 실패시 시작 / 중지되는 방식을보다 세밀하게 제어 할 수 있도록 구성 가능한 노드 랩퍼를 제공합니다. 이러한 프로세스는 다른 서비스와 마찬가지로 사용할 수 있습니다.

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

이 모듈은 일부 이벤트 로깅에서도 작동합니다.

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

스크립트를 데몬 화하는 것은 코드를 통해 수행됩니다. 예를 들면 다음과 같습니다.

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

이 모듈은 캡핑 재시작 (잘못된 스크립트가 서버를 방해하지 않음) 및 재시작 간격 증가와 같은 기능을 지원합니다.

노드 윈도우 서비스는 다른 서비스와 같이 실행되므로 이미 사용중인 소프트웨어로 서비스를 관리 / 모니터링 할 수 있습니다.

마지막으로 make종속성 이 없습니다 . 다시 말해, 간단합니다npm install -g node-windows 하게 작동합니다. 이를 설치하기 위해 Visual Studio, .NET 또는 node-gyp 마술이 필요하지 않습니다. 또한 MIT 및 BSD 라이센스입니다.

전체 공개에서, 나는이 모듈의 저자입니다. OP가 경험 한 정확한 고통을 덜어 주도록 설계되었지만 운영 체제가 이미 제공 한 기능에보다 밀접하게 통합되었습니다. 이 같은 질문을 가진 미래의 시청자들이 유용하다고 생각합니다.


8
이제 이것을 OS- X에서 동일한 기능을 제공하는 node-mac 로 포팅했습니다 .
Corey

1
나는 두 개의 노드 프로그램을 예약하고 노드 창, Forever 또는 Kue를 선택하기로 결정하기 전에 서 있습니다. 나는 노드 창에 기대어 있지만 수십 개의 노드 프로그램을 예약하고 모니터링 할 때 Forever 또는 Kue를 사용하지 않는 이유를 이해하고 싶습니다. 일부는 영원히 달립니다. 모니터링도 필요합니다.
Christiaan Westerbeek

5
노드 창은 백그라운드 서비스 관리를 위해 기본 OS를 사용하고 로깅을 위해 기본 이벤트 로그를 사용합니다. 영원히 자체 사용자 정의 모니터링 및 로깅 기능이 있습니다. 나는 medium.com/p/2a602ea657a2 에 이것에 대한 기사를 썼다. 당신은 스크립트를 예약해야하며, 항상 백그라운드 서비스로 실행하지는 않는 것처럼 들린다. Kue 및 Agenda와 같은 프로젝트는이를 위해 설계되었습니다. Node-windows & Forever는 다른 용도로 사용됩니다.
Corey

1
? @Corey는, 내가 노드 맥에 포함 된 예제를 실행 어떻게, 터미널에서, 난 노드 여기 install.js을 시도하지만, 픽업하고 helloworld.js하지 않는 것
에드윈 Ikechukwu 오콘을

@Edwin-사용중인 코드를 포함하여 문제에 대한 자세한 내용으로 새 질문을 여는 것이 가장 좋습니다.
Corey

28

업데이트 : pm2의 최신 정보를 포함하도록 업데이트되었습니다.

많은 사용 사례에서 시스템 서비스를 사용하는 것이 노드 프로세스를 관리하는 가장 간단하고 가장 적합한 방법입니다. 단일 환경에서 수많은 노드 프로세스 또는 독립적으로 실행되는 노드 마이크로 서비스를 실행하는 사용자에게 pm2는보다 완벽한 기능을 갖춘 도구입니다.

https://github.com/unitech/pm2

http://pm2.io

  • 그것은 정말 유용한 모니터링 기능을 가지고 있습니다-> 여러 프로세스가 pm2 monit있거나 프로세스 목록이있는 명령 줄 모니터링을위한 예쁜 'gui'pm2 list
  • 조직화 된 로그 관리-> pm2 logs
  • 다른 것들 :
    • 동작 구성
    • 소스 맵 지원
    • PaaS 호환
    • 시계 및 새로 고침
    • 모듈 시스템
    • 최대 메모리 재로드
    • 클러스터 모드
    • 핫 리로드
    • 개발 워크 플로우
    • 시작 스크립트
    • 자동 완성
    • 배포 워크 플로
    • 키 메트릭 모니터링
    • API

20

완료 될 때까지 중단없이 스크립트를 실행하려면 nohup여기에 이미 언급 된대로 사용할 수 있습니다. 그러나 어떤 답변도 로그 stdin및 로 전체 명령을 제공하지 않습니다 stdout.

nohup node index.js >> app.log 2>&1 &
  • >>수단에 추가 app.log.
  • 2>&1에 오류가 전송되어 stdout에 추가 되는지 확인하십시오 app.log.
  • &은 현재 터미널이 명령에서 분리되어 작업을 계속할 수 있도록합니다.

노드 서버 (또는 서버가 다시 시작될 때 백업되어야하는 것)를 실행하려면 systemd / systemctl을 사용해야 합니다.


1
최고의 답변 m8.
bholagabbar


19

OSX를 실행중인 경우 실제 시스템 프로세스를 생성하는 가장 쉬운 방법은 launchd 를 시작하는 것입니다.

다음과 같이 plist를 빌드하고 이름을 가진 / Library / LaunchDaemons에 넣으십시오 top-level-domain.your-domain.application.plist(배치 할 때 루트 여야 함).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

완료되면 이것을 루트로 발행하십시오 :

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

당신은 실행 중입니다.

다시 시작한 후에도 계속 실행됩니다.

plist의 다른 옵션은 다음 맨 페이지를 참조하십시오. https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


어떤 사용자가 서비스를 실행합니까? 사용자를 설정하는 방법이 있습니까?
rjmunro

15

nohup을 사용하는 경우이 명령을 실행하십시오.

nohup npm start 2>/dev/null 1>/dev/null&

영원히 사용하여 서버를 시작할 수도 있습니다

forever start -c "npm start" ./ 

PM2는 또한 지원 npm start

pm2 start npm -- start

2
thnx, 이것은 완벽하게 작동했습니다. pm2 start npm -- start
yadavr

13

나는 단순히 데몬 npm 모듈을 사용하고 있습니다 :

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

최근에는 TJ Holowaychuk의 mon (1) 을 사용하여 간단한 노드 앱을 시작하고 관리하고 있습니다.


12

개발에는 감독자를 사용합니다. 그냥 작동합니다. .js 파일을 변경할 때마다 Supervisor는 해당 변경 사항이로드 된 상태에서 앱을 자동으로 다시 시작합니다.

여기 Github 페이지에 대한 링크가 있습니다

설치 :

sudo npm 설치 관리자 -g

-e를 사용하여 다른 확장 프로그램을 쉽게 볼 수 있습니다. 내가 자주 사용하는 또 다른 명령은 특정 폴더를 무시하는 -i입니다.

nohup 및 supervisor를 사용하여 로그 아웃 한 후에도 백그라운드에서 노드 앱을 실행할 수 있습니다.

sudo nohup 관리자 myapp.js &


1
실제로 supervisor는 대부분의 데몬 모듈보다 더 나은 옵션이라고 생각합니다. 특히 업데이트를 체크 아웃하기 위해 webhook과 함께 사용됩니다.
Iain Collins

나는 이것을 두 번째로한다. PHP 파일을 변경하면 Apache 또는 Nginx 서버를 다시 시작 하시겠습니까? 기필코 아니다. 그렇다면 왜 Node.js 서버 전체를 다시 시작해야합니까? 이것이 최선의 해결책은 아니지만 Supervisor가 임대 할 때 재시작 프로세스에 대해 걱정할 필요가 없습니다 (실제로 재시작이 여전히 발생 함).
Zhang Buzz

7

WINDOWS XP 의 백그라운드 서비스 인 Node.js

설치:

  1. 설치 프로그램 실행 파일을 통해 WGET http://gnuwin32.sourceforge.net/packages/wget.htm 을 설치하십시오.
  2. 설치 프로그램 실행 파일을 통해 GIT http://code.google.com/p/msysgit/downloads/list 설치
  3. nnsm.exe를 % windir % / system32 폴더에 복사하여 NSSM http://nssm.cc/download/?page=download 를 설치하십시오.
  4. c : \ node \ helloworld.js를 만듭니다.

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
  5. 명령 콘솔을 열고 다음을 입력하십시오 (Resource Kit가 설치된 경우에만 setx).

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
  6. 멋진 배치 제품은 c : \ node \ ServiceMe.cmd를 만드는 것입니다.

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause

서비스 관리:

  • 서비스 자체는 이제 시작-> 실행-> services.msc 또는 시작-> 실행-> MSCONFIG-> 서비스를 통해 액세스 할 수 있습니다 ( '모든 Microsoft 서비스 숨기기'를 확인하십시오).
  • 스크립트는 배치 스크립트를 통해 만들어진 모든 노드 앞에 'node-'를 붙입니다.
  • 마찬가지로 레지스트리에서 찾을 수 있습니다 : " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "

7

허용되는 답변은 아마도 최고의 프로덕션 답변이지만 개발 작업을 수행하는 빠른 해킹의 경우 다음을 발견했습니다.

nodejs scriptname.js & nodejs가 &를 혼란스럽게하기 때문에 작동하지 않았으므로 scriptname.js가 죽지 않고 터미널을 계속 사용할 수 없었습니다.

그러나 나는 nodejs scriptname.js.sh 파일을 넣고 nohup sh startscriptname.sh &일했다.

확실히 생산적인 것은 아니지만 "터미널을 계속 사용해야하고 5 개의 다른 터미널을 시작하고 싶지 않습니다"문제를 해결합니다.


4

리눅스 서버에서 nodejs를 실행하고 있다면 이것이 최선의 방법이라고 생각합니다.

서비스 스크립트를 작성하고 /etc/init/nodejs.conf에 복사하십시오.

서비스 시작 : sudo service nodejs start

서비스 중지 : sudo service nodejs stop

서비스 스크립트

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script

4

2017 년 6 월 업데이트 :
Linux 용 솔루션 : (빨간 모자). 이전 의견은 저에게 효과적이지 않습니다. 이것은 Amazon Web Service-Red Hat 7에서 나를 위해 작동합니다. 이것이 누군가를 위해 작동하기를 바랍니다.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add

매우 흥미 롭습니다. 나는 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080그것이 무엇을하는지 궁금 합니다. 자세한 내용을 알려주세요. 나는 확실하지 않다 그러나 나는 트래픽을 리디렉션 생각 808080오른쪽에있는 노드 서버 듣는다?
Shakiba Moshiri '21

3

사용 nssm 창을위한 최적의 솔루션, 바로 다운로드 nssm nssm 디렉토리 및 유형, 개방 cmd를

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

그러면 새 windows 서비스가 services.msc에 나열되어 서비스 를 시작하거나 중지 할 수 있습니다.이 서비스는 자동으로 시작되며 실패하면 다시 시작하도록 구성 할 수 있습니다.


2

제안 된 다양한 옵션을 완성하기 위해, 여기에 하나 더하십시오 daemon: 당신은 여기에 대해 읽을 수있는 GNU / 리눅스에서 명령 http://libslack.org/daemon/manpages/daemon.1.html은 . (이것이 위의 의견 중 하나에서 이미 언급 된 경우 사과드립니다).



1

"2> & 1"의 위치에 대해 사소한 실수를 한 사람이 있습니까?

2>&1 >> file

해야한다

>> file 2>&1

1

원격 호스트의 다중 창 / 창 개발 환경에 tmux를 사용합니다. 프로세스를 백그라운드에서 분리하고 실행하는 것은 정말 간단합니다. TMUX 살펴보기


1

최신 버전의 데몬 npm 모듈을 사용하는 사람들 은 문자열 대신 파일 설명자를 전달해야합니다.

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});

0

PM2는로드 밸런서가 내장 된 Node.js 애플리케이션의 프로덕션 프로세스 관리자입니다. 응용 프로그램을 영구적으로 유지하고 다운 타임없이 다시로드하며 일반적인 시스템 관리 작업을 용이하게합니다. https://github.com/Unitech/pm2


심각한 메모리 소비 문제! phusion + nginx로 이동
Rizwan Patel

0

아무도 Guvnor 를 언급하지 않은 것에 놀랐습니다.

나는 pm2 등을 영원히 시도했지만, 견고한 제어 및 웹 기반 성능 지표와 관련 하여 Guvnor 가 훨씬 최고 라는 것을 알았 습니다. 또한 완전 오픈 소스이기도합니다.

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

편집 : 그러나 Windows에서 작동하는지 확실하지 않습니다. 나는 리눅스에서만 사용했다.


4
2017 년 부실한 것 같습니다. 빌드가 실패합니다. 작년에는 코드 푸시가 없습니다. 수상한.
azatar

0

제공된 답변 목록에이 옵션이 누락 되었으므로 2020 년 기준으로 도커 또는 이와 동등한 컨테이너 를 사용할 수있는 옵션을 추가하고 싶습니다. 플랫폼 . 응용 프로그램이 안정적인 환경에서 작동하도록하는 것 외에도 보안 성이 향상되고 이식성이 향상되었습니다.

Windows, macOS 및 대부분 / 주요 Linux 배포판에 대한 도커 지원이 있습니다. 지원되는 플랫폼에 도커 설치 것은 간단하고 잘 문서화되어 있습니다. Node.js 애플리케이션을 설정하는 것은 컨테이너에 넣고 컨테이너를 실행하는 동시에 종료 후 다시 시작되는지 확인하는 것만 큼 간단합니다.

컨테이너 이미지 생성

해당 서버의 / home / me / my-app 에서 애플리케이션을 사용할 수 있다고 가정하면 텍스트 파일 Dockerfile을 작성하십시오 . 폴더에 / 홈 / 날 / 내 - 응용 프로그램을 이것과 같은 내용으로 :

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

다음과 같은 명령을 사용하여 이미지를 작성하십시오.

docker build -t myapp-as-a-service /home/me

노트 : 마지막 매개 변수는 Dockerfile 자체 대신 해당 Dockerfile이 포함 된 폴더를 선택합니다. 옵션 -f를 사용하여 다른 것을 선택할 수 있습니다 .

컨테이너 시작

컨테이너를 시작하려면이 명령을 사용하십시오.

docker run -d --restart always -p 80:3000 myapp-as-a-service

이 명령은 앱이 포트 3000에서 수신 대기하고 있으며 호스트의 포트 80에서 노출되기를 원한다고 가정합니다.

이것은 매우 제한된 예이지만 좋은 출발점입니다.


0

pm2를 사용하는 경우 다음과 같이 autorestart설정하여 사용할 수 있습니다 false.

pm2 생태계

샘플이 생성됩니다 ecosystem.config.js.

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

pm2 시작 생태계 .config.js


-1

이 답변은 파티에 꽤 늦었지만 최선의 해결책은 screen -dmSand nohup명령을 모두 사용하는 쉘 스크립트를 작성하는 것임을 알았습니다 .

screen -dmS newScreenName nohup node myserver.js >> logfile.log

또한 >> logfile끝에 비트를 추가 하여 노드 console.log()명령문을 쉽게 저장할 수 있습니다 .

왜 쉘 스크립트를 사용 했습니까? 또한 node myserver.js프로세스가 이미 실행 중인지 확인한 if 문을 추가했습니다 .

이렇게하면 단일 명령 줄 옵션을 만들어서 서버를 계속 사용할 수 있고 변경 한 후에 서버를 다시 시작할 수있어 개발에 매우 ​​유용합니다.


2
나는이 문제에 봉착했으며 Linux에 익숙하지 않다. 스크린이나 nohup없이 어떻게 하시겠습니까?
Craig Norton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.