node.js 앱을 백그라운드 서비스로 실행하려면 어떻게 해야 합니까?
이 게시물은 수년간 많은 관심을 받아왔기 때문에, 저는 이 게시물 하단에 플랫폼별 상위 솔루션을 나열했습니다.
원본 게시물:
나는 내 node.js 서버가 백그라운드에서 실행되기를 원합니다. 즉, 내가 터미널을 닫을 때 나는 내 서버가 계속 실행되기를 원합니다.제가 이 튜토리얼을 구글에서 검색해 봤는데 뜻대로 작동하지 않습니다.그래서 저는 그 데몬 스크립트를 사용하는 대신 출력 리디렉션을 사용했다고 생각했습니다.2>&1 >> file
부분), 하지만 이것도 사라지지 않습니다. 단말기에 출력/오류 대기 중인 것처럼 빈 줄이 나타납니다.
프로세스를 백그라운드에서 실행하려고 했지만 터미널을 닫자마자 프로세스도 종료됩니다.
그러면 로컬 컴퓨터를 종료할 때 어떻게 실행 상태를 유지할 수 있습니까?
주요 솔루션:
Node.js 응용 프로그램을 자체 프로세스로 실행하려면 어떻게 해야 합니까?에서 나의 답변을 복사합니다.
2015년 답변: 거의 모든 Linux 디스트리뷰터는 systemd와 함께 제공되며, 이는 영구, 모니터, 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
Unix를 처음 사용하는 경우 참고: /var/www/myapp/app.js
했어야 했습니다#!/usr/bin/env node
합니다.chmod +x app.js
.
을 서스파에복다에 합니다./etc/systemd/system
.
시하기로 합니다.systemctl start myapp
.
시실가로 부팅 시 실행 systemctl enable myapp
.
가 있는 로그 journalctl -u myapp
이는 Linux/노드 서버를 구축하기 위한 AWS/DigitalOcean/Azure CloudConfig를 생성하는 명령어가 포함된 2018년 Linux 버전 노드 애플리케이션 구축 방법에서 가져온 것입니다..service
지정된 노드 스크립트가 연속적으로(즉, 영구적으로) 실행되도록 하는 간단한 CLI 도구인 Forever를 사용할 수 있습니다. https://www.npmjs.org/package/forever
업데이트 - 아래 답변 중 하나에서 언급한 것처럼 PM2에는 몇 가지 훌륭한 기능이 영원히 누락되어 있습니다.사용을 고려해 보십시오.
원답
업 사용 안 함:
nohup node server.js &
EDIT 저는 수락된 답변이 정말로 가야 할 길이라는 것을 덧붙이고 싶었습니다.저는 깨어 있어야 하는 경우에 영원히 사용하고 있습니다.하는것을 좋아합니다.npm install -g forever
노드경있다그음수다행니합냥는에로▁do다▁so니수▁and▁path.forever start server.js
이것은 일반적인 방법이 아닐 수도 있지만, 저는 특히 개발 중에 스크린으로 합니다. 왜냐하면 필요하다면 스크린을 다시 들고 놀 수 있기 때문입니다.
screen
node myserver.js
>>CTRL-A then hit D
화면이 분리되어 로그오프해도 그대로 유지됩니다.그러면 스크린-r로 다시 돌려받을 수 있습니다.자세한 내용은 화면 설명서를 참조하십시오.화면의 이름을 지정할 수 있습니다.
2016 업데이트:node-windows/mac/linux 시리즈는 모든 운영 체제에서 공통 API를 사용하기 때문에 관련 솔루션입니다.그러나 노드-리눅스는 systemv init 파일을 생성합니다.systemd의 인기가 계속 증가함에 따라 Linux에서는 현실적으로 더 나은 옵션입니다.노드-리눅스에 systemd 지원을 추가하고 싶은 사람이 있다면 홍보를 환영합니다 :-)
원본 스레드:
이것은 이제 꽤 오래된 스레드이지만 노드 창은 Windows에서 백그라운드 서비스를 만들 수 있는 또 다른 방법을 제공합니다.그것은 대략적으로 기반을 두고 있습니다.nssm
를 exe
노드 스크립트 주위의 래퍼입니다.하지만; 그것은 사용합니다.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-gip 마법을 사용하여 설치할 필요는 없습니다.또한 MIT와 BSD 허가를 받았습니다.
제가 이 모듈의 저자입니다.이 제품은 운영 체제가 이미 제공하는 기능과 긴밀하게 통합되어 OP가 경험한 정확한 고통을 덜어주기 위해 설계되었습니다.저는 이 질문을 가진 미래의 시청자들이 그것을 유용하게 생각하기를 바랍니다.
하려면 스립트가완때스중를없실단다다사수있습니용할음을 사용하면 .nohup
여기에 있는 답변에서 이미 언급했듯이.그러나 모든 응답이 로그에 기록되는 전체 명령을 제공하지는 않습니다.stdin
그리고.stdout
.
nohup node index.js >> app.log 2>&1 &
- 그
>>
는 에덧이수단에 추가하는 을 의미합니다.app.log
. 2>&1
가 도에오전확인니다합에도 .stdout
에추었니다습에 되었습니다.app.log
.- 딩엔
&
작업을 계속할 수 있도록 명령에서 현재 터미널의 연결이 끊어졌는지 확인합니다.
노드 서버(또는 서버가 재시작될 때 백업을 시작해야 하는 서버)를 실행하려면 systemd / systemctl을 사용해야 합니다.
업데이트: pm2의 최신 버전을 포함하도록 업데이트했습니다.
많은 사용 사례에서 systemd 서비스를 사용하는 것이 노드 프로세스를 관리하는 가장 간단하고 적절한 방법입니다.수많은 노드 프로세스를 실행하거나 단일 환경에서 독립적으로 노드 마이크로서비스를 실행하는 사람들에게 pm2는 더 완벽한 기능을 갖춘 도구입니다.
https://github.com/unitech/pm2
- 매우 유용한 기능 있으며, 러 은 정 말 있 을 예 위 링 쁜 한 모 다 'gui'와 함께 합니다.
pm2 monit
또는 프로세스 목록을 포함합니다.pm2 list
- 된 로그 체적인로관리 ->
pm2 logs
- 다른 것들:
- 동작 구성
- 소스 맵 지원
- PaaS 호환
- 보기 & 다시 로드
- 모듈 시스템
- 최대 메모리 다시 로드
- 클러스터 모드
- 핫 다시 로드
- 개발 워크플로우
- 시작 스크립트
- 자동완성
- 배포 워크플로우
- 주요 메트릭 모니터링
- API
noup을 사용하는 경우 이 명령을 실행해 보십시오.
nohup npm start 2>/dev/null 1>/dev/null&
또한 서버를 시작하는 데 영구적으로 사용할 수 있습니다.
forever start -c "npm start" ./
PM2를 지원합니다.npm start
pm2 start npm -- start
OSX를 프로세스를 은 OSX를 입니다.launchd
그것을 발사하기 위해.
/으로 /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
그리고 당신은 달리고 있습니다.
다시 시작한 후에도 계속 실행됩니다.
목록의 다른 옵션은 다음의 man 페이지를 참조하십시오. https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
저는 단순히 데몬 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)을 사용하여 간단한 노드 앱을 시작하고 관리하고 있습니다.
저는 개발을 위해 슈퍼바이저를 사용합니다.효과가 있을 뿐이죠..js 파일을 변경할 때마다 Supervisor는 해당 변경사항이 로드된 상태에서 앱을 자동으로 다시 시작합니다.
설치:
sundpm 설치 관리자 -g
-e로 다른 확장을 쉽게 볼 수 있습니다.제가 자주 사용하는 또 다른 명령은 -i로 특정 폴더를 무시하는 것입니다.
로그아웃한 후에도 noup 및 supervisor를 사용하여 노드 앱을 백그라운드에서 실행할 수 있습니다.
sudo noup 감독관 my app.js &
Windows XP의 백그라운드 서비스로 사용되는 Node.js
- Kudos는 Hacksparrow(http://www.hacksparrow.com/install-node-js-and-npm-on-windows.html 에서 Node.js + npm for windows를 설치하는 튜토리얼을 받습니다.
- Kudos는 nnsm을 위해 Tatham Oddie: http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/ 에 갑니다.실행
설치:
- 설치 관리자 실행 파일을 통해 WGET http://gnuwin32.sourceforge.net/packages/wget.htm 설치
- 설치 관리자 실행 파일을 통해 GIT http://code.google.com/p/msysgit/downloads/list 설치
- nnsm을 복사하여 NSSM http://nssm.cc/download/ ?page=hosts를 설치합니다.%windir%/system32 폴더에 exe
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/");
명령 콘솔을 열고 다음을 입력합니다(리소스 키트가 설치된 경우에만 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
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"를 찾을 수 있습니다.
수용된 답변이 아마도 최고의 프로덕션 답변일 것입니다. 하지만 개발 작업을 수행하는 빠른 해킹을 위해 저는 다음과 같은 것을 발견했습니다.
nodejs scriptname.js &
&을 것 작동하지 . dying.js &;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 그래서 스크립트name.js가 죽지 않고 터미널을 계속 사용할 수 없었습니다.
하지만 나는.nodejs scriptname.js
및 .sh 파일의 nohup sh startscriptname.sh &
일했다.
확실히 생산용은 아니지만, "단말기를 계속 사용해야 하고 5개의 터미널을 시작하고 싶지 않습니다"라는 문제를 해결합니다.
업데이트 2017년 6월 6일:
리눅스용 솔루션: (빨간 모자).저는 이전 댓글이 잘 안 맞아요.이것은 아마존 웹 서비스 - 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
리눅스 서버에서 nodejs를 실행하고 있다면 이것이 가장 좋은 방법이라고 생각합니다.
서비스 스크립트를 생성하고 /etc/init/nodejs.conf에 복사합니다.
서비스 시작: sudo 서비스 nodejs 시작
서비스 중지: sudo 서비스 nodejs 중지
서비스 스크립트
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
nssm을 사용하여 윈도우즈용으로 가장 적합한 솔루션을 다운로드한 후 cmd ton nssm 디렉토리를 열고 유형을 입력합니다.
nssm install <service name> <node path> <app.js path>
eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js"
그러면 services.msc에 나열된 새 Windows 서비스가 설치됩니다. 서비스를 시작하거나 중지할 수 있습니다. 이 서비스는 자동으로 시작되고 실패할 경우 다시 시작하도록 구성할 수 있습니다.
pm2 모듈을 사용합니다. pm2 nodejs 모듈
제공된 답변 목록에서 이 옵션이 누락되었기 때문에 2020년 기준으로 도커 또는 이와 동등한 컨테이너 플랫폼을 추가하고 싶습니다.애플리케이션이 안정적인 환경에서 작동하도록 보장하는 것 외에도 휴대성 향상과 더불어 추가적인 보안 이점이 있습니다.
Windows, macOS 및 대부분/주요 Linux 배포판에 대한 도커 지원이 있습니다.지원되는 플랫폼에 도커를 설치하는 것은 상당히 간단하고 문서화되어 있습니다.Node.js 응용 프로그램을 설정하는 것은 컨테이너에 넣고 해당 컨테이너를 실행하는 동시에 종료 후 다시 시작되도록 하는 것만큼 간단합니다.
컨테이너 이미지 만들기
해당 서버의 /home/me/my-app에서 응용 프로그램을 사용할 수 있다고 가정하면 다음과 유사한 내용을 가진 텍스트 파일 Docker 파일을 /home/me 폴더에 만듭니다.
FROM node:lts-alpine
COPY /my-app/ /app/
RUN cd /app && npm ci
CMD ["/app/server.js"]
에서 Node하며 Alpine Linux에서 LTS 노드.js를 실행합니다.npm ci
종속성이 해당 런타임 컨텍스트와 일치하는지 확인합니다.
내용이 있는 동일한 폴더에 다른 파일 .dockerignore 생성
**/node_modules
이렇게 하면 호스트 시스템의 기존 종속성이 컨테이너에서 작동하지 않을 수 있으므로 컨테이너에 주입되지 않습니다.된 시된제입니다.RUN
도커 파일의 명령으로 해결할 수 있습니다.
다음과 같은 명령을 사용하여 이미지를 만듭니다.
docker build -t myapp-as-a-service /home/me
그-t
옵션은 빌드된 컨테이너 이미지의 "이름"을 선택하는 것입니다.아래의 실행 중인 컨테이너에 사용됩니다.
참고: 마지막 매개 변수는 Docker 파일 자체 대신 해당 Docker 파일이 들어 있는 폴더를 선택하는 것입니다.옵션을 사용하여 다른 항목을 선택할 수 있습니다.-f
.
시작 컨테이너
컨테이너를 시작하려면 다음 명령을 사용합니다.
docker run -d --restart always -p 80:3000 myapp-as-a-service
이 명령은 앱이 포트 3000에서 수신 중이며 호스트의 포트 80에서 노출되기를 원한다고 가정합니다.
이것은 확실히 매우 제한적인 예이지만, 좋은 출발점입니다.
제안된 다양한 옵션을 정리하기 위해, 여기에 한 가지 더 있습니다:daemon
GNU/리눅스로 된 명령. 여기에서 읽을 수 있습니다. http://libslack.org/daemon/manpages/daemon.1.html . (위의 주석 중 하나에 이미 언급되어 있는 경우에는 이 명령을 참조하십시오.
푸그를 확인해 보세요!많은 작업자를 시작하는 것 외에도 노드 프로세스를 악마화할 수 있습니다!
PM2는 로드 밸런서가 내장된 Node.js 애플리케이션용 프로덕션 프로세스 관리자입니다.따라서 애플리케이션을 영구적으로 활성화하고 다운타임 없이 다시 로드하며 일반적인 시스템 관리 작업을 쉽게 수행할 수 있습니다.https://github.com/Unitech/pm2
아무도 거브너에 대해 언급하지 않은 것이 놀랍습니다.
저는 pm2 등 영원히 노력했습니다.하지만 확실한 제어와 웹 기반 성능 지표에 관해서는 Govnor가 단연 최고라는 것을 알게 되었습니다.게다가, 그것은 또한 완전히 오픈 소스입니다.
편집 : 하지만 창에서 작동하는지는 잘 모르겠습니다.리눅스에서만 사용해봤어요.
"2>&1"의 위치에 대한 사소한 실수를 알아차린 사람이 있습니까?
2>&1 >> file
그래야 한다
>> file 2>&1
원격 호스트의 다중 창/창 개발 환경에 tmux를 사용합니다.프로세스를 백그라운드에서 분리하고 실행하는 것은 매우 간단합니다.tmux를 보세요.
최신 버전의 데몬 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
});
만약 당신이 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
RHEL 8 AWS EC2 인스턴스에서 @mikemaccana의 승인된 응답을 사용할 때 다음 오류가 발생했습니다.(code=exited, status=216/GROUP)
사용자/그룹을 'nobody'로 설정했기 때문입니다.
구글링을 해보면, user/group을 'nobody'/'nobroup'으로 사용하는 것은 여기 유닉스 스택 교환에서 답했듯이 데몬에게 나쁜 관행인 것 같습니다.
사용자/그룹을 실제 사용자 및 그룹으로 설정한 후에는 매우 효과적이었습니다.
입력할 수 있습니다.whomai
그리고.groups
이 문제를 해결하기 위해 사용 가능한 옵션을 확인합니다.
mongodb가 있는 전체 스택 노드 앱에 대한 내 서비스 파일:
[Unit]
Description=myapp
After=mongod.service
[Service]
ExecStart=/home/myusername/apps/myapp/root/build/server/index.js
Restart=always
RestartSec=30
User=myusername
Group=myusername
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/myusername/apps/myapp
[Install]
WantedBy=multi-user.target
여러 인스턴스( fastify 한 후 노드를 JS 앱의 여러 인스턴스(express, fastify 등)를 시작한 다음concurrently
선택사항일 수도 있습니다.설정은 다음과 같습니다.
사전 요구 사이트
- 이 NodeJS 앱(express, fastify 등)에 됩니다.
/opt/mca/www/mca-backend/app
경로. 경로. - 를 통해 v합니다.
brew install node@16
세우다
설치: 동시설:
npm install -g concurrently
~/Library/LaunchAgents/mca.backend.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>mca.backend</string> <key>LimitLoadToSessionType</key> <array> <string>Aqua</string> <string>Background</string> <string>LoginWindow</string> <string>StandardIO</string> <string>System</string> </array> <key>ProgramArguments</key> <array> <string>/usr/local/bin/concurrently</string> <string>--names</string> <string>dev,prd</string> <string>--success</string> <string>all</string> <string>--kill-others</string> <string>--no-color</string> <string>MCA_APP_STAGE=dev node ./server.mjs</string> <string>MCA_APP_STAGE=prod node ./server.mjs</string> </array> <key>RunAtLoad</key> <true/> <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/local/opt/node@16/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string> </dict> <key>WorkingDirectory</key> <string>/opt/mca/www/mca-backend/app</string> <key>StandardErrorPath</key> <string>/opt/mca/www/mca-backend/err.log</string> <key>StandardOutPath</key> <string>/opt/mca/www/mca-backend/out.log</string> </dict> </plist>
및
launchctl bootstrap gui/`id -u` $HOME/Library/LaunchAgents/mca.backend.plist
:
launchctl print gui/`id -u`/mca.backend
중지:
launchctl kill SIGTERM gui/`id -u`/mca.backend
Restart: 시다/시시작작:
launchctl kickstart -k -p gui/`id -u`/mca.backend
이상 하지 않은 경우 : 더이필않경우언로드:
launchctl bootout gui/`id -u`/mca.backend
중요:서비스를 로드하면launchctl bootstrap
파일에서 한 내용이 경우~/Library/LaunchAgents/mca.backend.plist
을 수행하지 ).launchctl bootout
후합니다( 를사하다로다니드합시여를 하여).launchctl bootstrap
).
문제 해결
다음 위치에서 시작된 로그 참조:/private/var/log/com.apple.xpc.launchd/launchd.log
제가 좀 늦었습니다.간단한 해결책은 아래와 같이 터미널에서 두 개의 명령을 실행하는 것입니다.
nohup node ./server.js &
disown -h %1
그런 다음 SSH 세션을 닫으면 노드 프로그램이 계속 실행됩니다.Ubuntu 18에서 테스트되었습니다.
이 답변은 파티에 꽤 늦었지만, 저는 가장 좋은 해결책이 두 가지를 모두 사용하는 셸 스크립트를 작성하는 것이라는 것을 발견했습니다.screen -dmS
그리고.nohup
명령을 실행합니다.
screen -dmS newScreenName nohup node myserver.js >> logfile.log
또한 다음을 추가합니다.>> logfile
할 수 .console.log()
진술들.
셸 스크립트를 사용한 이유는 무엇입니까?에서 if if if if if if if if if if if if if if if if if if if if if if if 를 하는 문장도 했습니다.node myserver.js
프로세스가 이미 실행 중입니다.
이렇게 하면 서버를 계속 운영할 수 있는 단일 명령줄 옵션을 만들 수 있고 변경 후 재시작할 수 있어 개발에 매우 유용합니다.
언급URL : https://stackoverflow.com/questions/4018154/how-do-i-run-a-node-js-app-as-a-background-service
'programing' 카테고리의 다른 글
입력 텍스트 상자에서 값 가져오기 (0) | 2023.05.31 |
---|---|
Rspec에서 특정 테스트만 실행하려면 어떻게 해야 합니까? (0) | 2023.05.31 |
하위 프로세스 호출에서 종료 코드 및 stderr 가져오기 (0) | 2023.05.31 |
NSZombie란 무엇입니까? (0) | 2023.05.31 |
Vue 2 - 음소거 소품 Vue-warn (0) | 2023.05.31 |