Bagaimana cara menjalankan aplikasi node.js sebagai layanan latar belakang?

503

Karena posting ini telah mendapat banyak perhatian selama bertahun-tahun, saya telah mendaftarkan solusi teratas per platform di bagian bawah posting ini.


Pos asli :

Saya ingin server node.js saya berjalan di latar belakang, yaitu: ketika saya menutup terminal saya ingin server saya tetap berjalan. Saya sudah googled ini dan datang dengan tutorial ini , tetapi tidak berfungsi sebagaimana dimaksud. Jadi alih-alih menggunakan skrip daemon, saya pikir saya hanya menggunakan redirection output ( 2>&1 >> filebagian), tetapi ini juga tidak keluar - saya mendapatkan baris kosong di terminal saya, seperti sedang menunggu output / kesalahan.

Saya juga mencoba untuk meletakkan proses di latar belakang, tetapi begitu saya menutup terminal saya prosesnya juga mati.

Jadi bagaimana saya bisa membiarkannya berjalan ketika saya mematikan komputer lokal saya?


Solusi teratas :

Peter Kruithof
sumber
3
Saya pikir dia bermaksud untuk mematikan sistem lokalnya
Kamal Reddy
46
maksudnya menutup sesi ssh mengakhiri tugas
thjanjan
5
github.com/Unitech/pm2 adalah manajer proses yang sangat terawat dan sangat stabil, cobalah!
Unitech
1
Anda dapat menggunakan layar ( aperiodic.net/screen/quick_reference )
karantan

Jawaban:

435

Menyalin jawaban saya sendiri dari Bagaimana cara menjalankan aplikasi Node.js sebagai prosesnya sendiri?

Jawaban 2015 : hampir setiap distro Linux hadir dengan systemd, yang berarti selamanya, monit, PM2, dll tidak lagi diperlukan - OS Anda sudah menangani tugas-tugas ini .

Buat myapp.servicefile (ganti 'myapp' dengan nama aplikasi Anda, tentu saja):

[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

Catatan jika Anda baru menggunakan Unix: /var/www/myapp/app.js seharusnya ada #!/usr/bin/env nodedi baris pertama.

Salin file layanan Anda ke /etc/systemd/system.

Mulai dengan systemctl start myapp.

Aktifkan untuk dijalankan saat boot dengan systemctl enable myapp.

Lihat log dengan journalctl -u myapp

Ini diambil dari Bagaimana kami menggunakan aplikasi simpul di Linux, edisi 2018 , yang juga mencakup perintah untuk menghasilkan AWS / DigitalOcean / Azure CloudConfig untuk membangun Linux / server simpul (termasuk .servicefile).

mikemaccana
sumber
4
Pemula, ketika tersedia juga merupakan solusi yang baik. Bagaimanapun, Anda tidak harus bergantung pada proses nodejs untuk menjaga daemon nodejs Anda tetap berjalan. Ini adalah satu tugas untuk OS semata-mata. killall nodejs dan selamanya hilang ....
131
19
Perhatikan bahwa juga dimungkinkan untuk menjalankan layanan systemd sebagai pengguna. Lihat misalnya tutorial ini . Anda dapat memasukkan file layanan Anda ~/.config/systemd/user, mulai dengan systemctl --user start myapp, aktifkan dengan systemctl --user enable myapp.
cdauth
5
Terima kasih atas jawaban ini. Ini yang saya inginkan murni dan jelas
bmavus
5
Saya menerima jawaban ini alih-alih jawaban "selamanya", karena saya juga berpikir ini adalah cara terbaik untuk melakukannya. Ada jawaban serupa untuk Mac & Windows, tapi saya kira mayoritas mencari solusi Linux.
Peter Kruithof
11
di jalur AMI EC2 / etc / systemd / system tidak ada. Bisakah Anda menunjukkan jalur apa yang benar di AWS EC2 Linux AMI?
René Michel
241

Anda dapat menggunakan Forever, alat CLI sederhana untuk memastikan bahwa skrip node yang diberikan berjalan terus menerus (yaitu selamanya): https://www.npmjs.org/package/forever

menghafal
sumber
4
Dengan simpul terbaru, saya tidak dapat menghentikan aplikasi melalui nama skrip (kesalahan) - juga - umumnya mengalami gangguan (menggunakan OS-X) - semuanya dibangun dari sumber, anehnya. Meninggalkan hal-hal dalam keadaan yang buruk, tidak memenuhi saya dengan keyakinan.
Michael Neale
4
Sementara nohup melakukan triknya, selamanya adalah solusi yang lebih baik karena prosesnya teramonisasi. Alat hebat!
Peter Kruithof
5
Ngomong
2
Saya menggunakan Forever untuk sementara waktu, pada awalnya semuanya tampak baik-baik saja tetapi kemudian bencana terjadi. Selamanya tidak bisa mengelola proses lagi dan membiarkannya berjalan liar. Masih berjuang mencari solusi yang lebih baik. Saya akan mencoba menggunakan nohup
LN
5
Geoffrey- tidak, Anda harus melakukannya forever start /path/to/yourApp.jsdi skrip startup server Anda.
mikermcneil
215

PEMBARUAN - Seperti disebutkan dalam salah satu jawaban di bawah ini, PM2 memiliki beberapa fungsionalitas yang sangat bagus yang hilang selamanya. Pertimbangkan untuk menggunakannya.

Jawaban Asli

Gunakan nohup :

nohup node server.js &

EDIT Saya ingin menambahkan bahwa jawaban yang diterima benar-benar cara untuk pergi. Saya menggunakan selamanya pada contoh yang perlu begadang. Saya suka melakukannya npm install -g foreverdi jalur simpul dan kemudian lakukanforever start server.js

NG.
sumber
136
Bagian keren untuk diketahui: nohupsingkatan no hangupyang berasal dari masa lalu, di mana Anda ingin Anda menjaga proses tetap hidup ketika Anda "hangup" modem Anda.
jAndy
1
saat ini lebih tepatnya nama sinyal 1 yang proses terima untuk memperingatkan bahwa pengguna menutup shell (atau kehilangan koneksi modem, tentu saja: P)
lapo
7
Ini bukan solusi terbaik karena jika aplikasi menemukan kesalahan yang tidak tertangkap, proses simpul akan keluar dan tidak memulai ulang. Namun, ini merupakan opsi yang masuk akal untuk pengembangan.
Andy E
1
Bagaimana saya menambahkan variabel lingkungan ke dalamnya? misal: PORT = 80 node server.js
Pardoner
1
Lihatlah jawaban ini dari SO - stackoverflow.com/questions/8825460/…
NG.
67

Ini mungkin bukan cara yang diterima, tapi saya melakukannya dengan layar, terutama saat dalam pengembangan karena saya bisa membawanya kembali dan membodohinya jika perlu.

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

Layar akan melepaskan dan bertahan Anda log off. Maka Anda bisa mendapatkannya kembali melakukan layar -r. Tekan manual layar untuk detail lebih lanjut. Anda dapat memberi nama layar dan yang lainnya jika Anda suka.

Brent
sumber
2
Juga, tmux itu bagus. Bekerja seperti layar (CTRL-B adalah default, bukan CTRL-A, tetapi dapat dikonfigurasi). Tmux memiliki panel (layar terbagi).
snapfractalpop
1
Layar memiliki panel juga
Billy Moon
Saya menggunakan ini sejak beberapa minggu untuk aplikasi meteor. `$ screen -dr 'untuk melepaskan dan memasang kembali mungkin diperlukan sesekali.
Vinay Vemula
Bagi saya cara termudah untuk menyelesaikan pekerjaan. Tapi saya setuju, bukan solusi terbaik
Pomme De Terre
Solusi ini tidak bertahan setelah reboot sistem
wnasich
60

Pembaruan 2016: Seri node-windows / mac / linux menggunakan API umum di semua sistem operasi, jadi ini benar-benar solusi yang relevan. Namun; node-linux menghasilkan file systemv init. Karena systemd terus tumbuh dalam popularitas, secara realistis pilihan yang lebih baik di Linux. Selamat datang PR jika ada yang ingin menambahkan dukungan systemd ke node-linux :-)

Utas asli:

Ini adalah utas yang cukup lama sekarang, tetapi node-windows menyediakan cara lain untuk membuat layanan latar belakang pada Windows. Ini secara longgar didasarkan pada nssmkonsep menggunakan exepembungkus di sekitar skrip simpul Anda. Namun; ia menggunakan winsw.exesebaliknya dan menyediakan pembungkus simpul yang dapat dikonfigurasi untuk kontrol lebih rinci tentang bagaimana proses dimulai / berhenti pada kegagalan. Proses-proses ini tersedia seperti layanan lainnya:

masukkan deskripsi gambar di sini

Modul ini juga dibuat di beberapa event logging:

masukkan deskripsi gambar di sini

Daemonisasi skrip Anda dilakukan melalui kode. Sebagai contoh:

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();

Modul ini mendukung hal-hal seperti capping restart (jadi skrip yang buruk tidak menyumbat server Anda) dan interval waktu yang bertambah antara restart.

Karena layanan node-windows berjalan seperti yang lain, dimungkinkan untuk mengelola / memantau layanan dengan perangkat lunak apa pun yang sudah Anda gunakan.

Akhirnya, tidak ada makeketergantungan. Dengan kata lain, lugas npm install -g node-windowsakan bekerja. Anda tidak perlu sihir Visual Studio, .NET, atau simpul-gyp untuk menginstal ini. Juga, ini berlisensi MIT dan BSD.

Dalam pengungkapan penuh, saya penulis modul ini. Itu dirancang untuk menghilangkan rasa sakit yang dialami OP, tetapi dengan integrasi yang lebih ketat ke dalam fungsionalitas yang sudah disediakan Sistem Operasi. Saya berharap pemirsa di masa depan dengan pertanyaan yang sama akan bermanfaat.

Corey
sumber
8
Saya sekarang telah porting ini ke node-mac , menyediakan fungsionalitas yang sama di OSX.
Corey
1
Saya sampai pada titik untuk menjadwalkan beberapa program Node dan berdiri di depan keputusan untuk memilih node-windows, Forever atau Kue. Saya condong ke simpul-windows tetapi ingin memahami mengapa tidak menggunakan Forever atau Kue ketika saya ingin menjadwalkan dan memantau selusin program simpul. Beberapa berjalan selamanya. Perlu pemantauan juga.
Christiaan Westerbeek
5
Node-windows menggunakan OS asli untuk mengelola layanan latar belakang, dan log peristiwa asli untuk logging. Forever memiliki pemantauan & pencatatan kustom sendiri. Saya menulis artikel tentang ini di media.com/p/2a602ea657a2 Sepertinya Anda perlu menjadwalkan skrip Anda, tidak menjalankannya sepanjang waktu sebagai layanan latar belakang. Proyek seperti Kue dan Agenda dirancang untuk ini. Node-windows & Forever melayani tujuan yang berbeda.
Corey
1
@Corey, bagaimana saya menjalankan contoh yang termasuk dalam node-mac?, Dari terminal, saya mencoba simpul install.js, tetapi tampaknya tidak mengambil helloworld.js
Edwin Ikechukwu Okonkwo
@ Edwin - Mungkin sebaiknya membuka pertanyaan baru dengan lebih detail tentang masalah, termasuk kode yang Anda gunakan.
Corey
28

UPDATE : saya diperbarui untuk memasukkan yang terbaru dari PM2:

untuk banyak kasus penggunaan, menggunakan layanan systemd adalah cara paling sederhana dan paling tepat untuk mengelola proses simpul. bagi mereka yang menjalankan banyak proses simpul atau menjalankan layanan simpul mikro secara mandiri dalam satu lingkungan, pm2 adalah alat berfitur lebih lengkap.

https://github.com/unitech/pm2

http://pm2.io

  • ini memiliki fitur pemantauan yang sangat berguna -> cukup 'gui' untuk pemantauan baris perintah dengan beberapa proses pm2 monitatau dengan daftar prosespm2 list
  • pengelolaan Log terorganisir -> pm2 logs
  • hal-hal lain:
    • Konfigurasi perilaku
    • Dukungan peta sumber
    • Kompatibel dengan PaaS
    • Tonton & Muat Ulang
    • Sistem Modul
    • Muat ulang memori maks
    • Mode Cluster
    • Hot reload
    • Alur kerja pengembangan
    • Skrip Startup
    • Penyelesaian otomatis
    • Alur kerja penyebaran
    • Pemantauan keymetrics
    • API
Kandang kelinci
sumber
20

Jika Anda hanya ingin menjalankan skrip tanpa gangguan sampai selesai, Anda dapat menggunakan nohupsebagaimana telah disebutkan dalam jawaban di sini. Namun, tidak ada jawaban yang memberikan perintah lengkap yang juga mencatat stdindan stdout.

nohup node index.js >> app.log 2>&1 &
  • The >>berarti menambahkan ke app.log.
  • 2>&1memastikan bahwa kesalahan juga dikirim ke stdoutdan ditambahkan ke app.log.
  • Penutup &memastikan terminal Anda saat ini terputus dari perintah sehingga Anda dapat terus bekerja.

Jika Anda ingin menjalankan server node (atau sesuatu yang harus mulai kembali ketika server restart) Anda harus menggunakan systemd / systemctl .

Xeoncross
sumber
1
jawaban terbaik m8.
bholagabbar
1
dijelaskan dengan baik
Prakhar Prakash Bhardwaj
19

Jika Anda menjalankan OSX, maka cara termudah untuk menghasilkan proses sistem yang benar adalah dengan menggunakannya launchduntuk meluncurkannya.

Bangun plist seperti ini, dan letakkan di / Library / LaunchDaemon dengan nama top-level-domain.your-domain.application.plist(Anda harus root ketika meletakkannya):

<?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>

Setelah selesai, terbitkan ini (sebagai root):

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

dan Anda berlari.

Dan Anda masih akan berjalan setelah restart.

Untuk opsi lain dalam daftar lihat halaman manual di sini: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

Lars Christensen
sumber
Pengguna apa yang akan menjalankan layanan ini? Apakah ada cara untuk mengatur pengguna?
rjmunro
15

Coba jalankan perintah ini jika Anda menggunakan nohup -

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

Anda juga dapat menggunakan selamanya untuk memulai server

forever start -c "npm start" ./ 

PM2 juga mendukung npm start

pm2 start npm -- start
Himanshu Teotia
sumber
2
Terima kasih, ini bekerja dengan sempurna. pm2 start npm -- start
yadavr
13

Saya hanya menggunakan modul daemon 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
});

Akhir-akhir ini saya juga menggunakan mon (1) dari TJ Holowaychuk untuk memulai dan mengelola aplikasi simpul sederhana.

Catatan
sumber
12

Saya menggunakan Supervisor untuk pengembangan. Itu hanya bekerja. Kapan pun Anda membuat perubahan pada file .js, Supervisor secara otomatis memulai ulang aplikasi Anda dengan perubahan itu dimuat.

Berikut tautan ke halaman Github-nya

Install :

sudo npm instal supervisor -g

Anda dapat dengan mudah membuatnya menonton ekstensi lain dengan -e. Perintah lain yang sering saya gunakan adalah -i untuk mengabaikan folder tertentu.

Anda dapat menggunakan nohup dan penyelia untuk membuat aplikasi simpul Anda berjalan di latar belakang bahkan setelah Anda keluar.

sudo nohup supervisor myapp.js &

Donald Gary
sumber
1
Saya pikir dalam praktiknya supervisor adalah pilihan yang lebih baik daripada sebagian besar modul daemon, terutama digunakan bersama dengan webhook untuk checkout pembaruan.
Iain Collins
Saya yang kedua ini. Jika Anda mengubah file PHP, apakah Anda akan me-restart server Apache atau Nginx? Tentu saja tidak. Lalu mengapa repot-repot me-restart seluruh server Node.js bahkan hanya mengubah satu baris kode? Meskipun ini mungkin bukan solusi terbaik, sewa dengan Supervisor Anda tidak perlu khawatir tentang proses restart (sebenarnya restart masih terjadi).
Zhang Buzz
7

Node.js sebagai layanan latar belakang di WINDOWS XP

Instalasi:

  1. Instal WGET http://gnuwin32.sourceforge.net/packages/wget.htm melalui installer yang dapat dieksekusi
  2. Instal GIT http://code.google.com/p/msysgit/downloads/list melalui installer yang dapat dieksekusi
  3. Instal NSSM http://nssm.cc/download/?page=download melalui menyalin nnsm.exe ke folder% windir% / system32
  4. Buat 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. Buka konsol perintah dan ketik berikut ini (setx hanya jika Resource Kit diinstal)

    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. Goodie batch bagus adalah membuat c: \ node \ ServiceMe.cmd

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

Manajemen Pelayanan:

  • Layanan itu sendiri sekarang dapat diakses melalui Start-> Run-> services.msc atau melalui Start-> Run-> MSCONFIG-> Layanan (dan centang 'Sembunyikan Semua Layanan Microsoft').
  • Skrip akan mengawali setiap node yang dibuat melalui skrip batch dengan 'node-'.
  • Demikian juga mereka dapat ditemukan di registri: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "
Page2PagePro
sumber
7

Jawaban yang diterima mungkin adalah jawaban produksi terbaik, tetapi untuk peretasan cepat yang melakukan pekerjaan dev, saya menemukan ini:

nodejs scriptname.js & tidak bekerja, karena nodejs tampaknya melahap &, dan hal itu tidak membiarkan saya tetap menggunakan terminal tanpa scriptname.js sekarat.

Tapi saya memasukkan nodejs scriptname.jsfile .sh, dan nohup sh startscriptname.sh &berhasil.

Jelas bukan hal produksi, tetapi memecahkan masalah "Saya harus tetap menggunakan terminal saya dan tidak ingin memulai 5 terminal yang berbeda".

ArtHare
sumber
4

Jika Anda menjalankan nodejs di server linux, saya pikir ini adalah cara terbaik.

Buat skrip layanan dan salin ke /etc/init/nodejs.conf

mulai layanan: sudo layanan simpul mulai

berhenti layanan: sudo layanan simpul berhenti

Skrip Sevice

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - [email protected]"

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
Pedro Muniz
sumber
4

Pembaruan Juni 2017:
Solusi untuk Linux: (Red hat). Komentar sebelumnya tidak berhasil untuk saya. Ini bekerja untuk saya di Amazon Web Service - Red Hat 7. Semoga ini bekerja untuk seseorang di luar sana.

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
Eman Jayme
sumber
Sangat menarik, saya hanya ingin tahu tentang iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080apa fungsinya. Bisakah Anda memberi saya detail lebih lanjut? Saya tidak yakin tapi saya pikir itu pengalihan lalu lintas dari 80ke 8080mana simpul mendengarkan server untuk, kan?
Shakiba Moshiri
3

gunakan nssm solusi terbaik untuk windows, cukup unduh nssm , buka cmd untuk direktori dan jenis nssm

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

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

ini akan menginstal layanan windows baru yang akan terdaftar di services.msc dari sana Anda dapat memulai atau menghentikan layanan, layanan ini akan mulai secara otomatis dan Anda dapat mengonfigurasi untuk memulai kembali jika gagal.

Aun Rizvi
sumber
2

Untuk melengkapi berbagai opsi yang disarankan, berikut ini adalah satu lagi: daemonperintah di GNU / Linux, yang dapat Anda baca di sini: http://libslack.org/daemon/manpages/daemon.1.html . (permintaan maaf jika ini sudah disebutkan dalam salah satu komentar di atas).

ravi
sumber
1

Lihat fugue! Selain meluncurkan banyak pekerja, Anda juga dapat merusak proses simpul Anda!

http://github.com/pgte/fugue

Shripad Krishna
sumber
1

Adakah yang melihat ada kesalahan sepele tentang posisi "2> & 1"?

2>&1 >> file

seharusnya

>> file 2>&1
osexp2003
sumber
1

Saya menggunakan tmux untuk lingkungan pengembangan beberapa jendela / panel pada host jarak jauh. Sangat mudah untuk melepaskan dan menjaga proses tetap berjalan di latar belakang. Lihatlah tmux

Karl Pokus
sumber
1

Untuk orang-orang yang menggunakan versi yang lebih baru dari modul daemon npm - Anda harus meneruskan deskriptor file alih-alih string:

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

PM2 adalah manajer proses produksi untuk aplikasi Node.js dengan penyeimbang beban bawaan. Hal ini memungkinkan Anda untuk menjaga aplikasi tetap hidup selamanya, memuatnya kembali tanpa downtime dan untuk memfasilitasi tugas-tugas admin sistem umum. https://github.com/Unitech/pm2

Arezki Lebdiri
sumber
masalah konsumsi memori yang serius! pilihlah phusion + nginx
Rizwan Patel
0

Saya terkejut bahwa tidak ada yang menyebut Guvnor

Saya telah mencoba selamanya, pm2, dll. Tetapi, ketika datang ke kontrol yang solid dan metrik kinerja berbasis web, saya telah menemukan Guvnor sejauh ini yang terbaik. Plus, itu juga sepenuhnya opensource.

masukkan deskripsi gambar di sini

Sunting: Namun, saya tidak yakin apakah itu berfungsi di windows. Saya hanya menggunakannya di linux.

Josh
sumber
4
Tampaknya basi pada 2017. Build gagal. Tidak ada kode yang didorong pada tahun lalu. Dipertanyakan.
azatar
0

Karena saya kehilangan opsi ini dalam daftar jawaban yang disediakan, saya ingin menambahkan opsi yang memenuhi syarat pada 2020: buruh pelabuhan atau platform wadah yang setara . Selain memastikan aplikasi Anda berfungsi di lingkungan yang stabil, ada manfaat keamanan tambahan serta portabilitas yang ditingkatkan.

Ada dukungan buruh pelabuhan untuk Windows, macOS dan sebagian besar / distribusi Linux utama. Memasang buruh pelabuhan pada platform yang didukung agak lurus ke depan dan didokumentasikan dengan baik. Menyiapkan aplikasi Node.js semudah memasukkannya ke dalam wadah dan menjalankan wadah itu sambil memastikannya dimulai kembali setelah dimatikan.

Buat Gambar Kontainer

Dengan asumsi aplikasi Anda tersedia di / home / me / my-app di server itu, buat file teks Dockerfile di folder / home / me / my-app dengan konten yang mirip dengan yang ini:

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

Buat gambar menggunakan perintah seperti ini:

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

Catatan: Parameter terakhir adalah memilih folder yang berisi Dockerfile bukan Dockerfile itu sendiri. Anda dapat memilih yang berbeda menggunakan opsi -f .

Mulai Kontainer

Gunakan perintah ini untuk memulai wadah:

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

Perintah ini mengasumsikan aplikasi Anda mendengarkan pada port 3000 dan Anda ingin aplikasi tersebut diekspos pada port 80 host Anda.

Ini adalah contoh yang sangat terbatas pasti, tetapi ini adalah titik awal yang baik.

Thomas Urban
sumber
0

Jika Anda menggunakan pm2, Anda dapat menggunakannya dengan autorestartset ke false:

ekosistem $ pm2

Ini akan menghasilkan sampel 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 mulai ekosistem.config.js

Julien Le Coupanec
sumber
-1

Jawaban ini cukup terlambat untuk pesta, tetapi saya menemukan bahwa solusi terbaik adalah dengan menulis skrip shell yang menggunakan perintah screen -dmSdan keduanya nohup.

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

Saya juga menambahkan >> logfilebit di bagian akhir sehingga saya dapat dengan mudah menyimpan console.log()pernyataan simpul .

Mengapa saya menggunakan skrip shell? Yah saya juga menambahkan pernyataan if yang memeriksa untuk melihat apakah node myserver.jsproses sudah berjalan.

Dengan begitu saya dapat membuat opsi baris perintah tunggal yang memungkinkan saya menjaga server tetap aktif dan juga me-restart ketika saya telah membuat perubahan, yang sangat membantu untuk pengembangan.

Anwar Hahj Jefferson-George
sumber
2
Saya mengalami masalah ini dan saya cukup baru di Linux. Bagaimana Anda melakukannya tanpa layar atau nohup?
Craig Norton