Bagaimana menjalankan Node.js sebagai proses latar belakang dan tidak pernah mati?

480

Saya terhubung ke server linux melalui dempul SSH. Saya mencoba menjalankannya sebagai proses latar belakang seperti ini:

$ node server.js &

Namun, setelah 2,5 jam terminal menjadi tidak aktif dan proses mati. Apakah ada cara lain agar saya bisa menjaga proses tetap hidup bahkan dengan terminal terputus?


Edit 1

Sebenarnya, saya sudah mencoba nohup, tetapi begitu saya menutup terminal Putty SSH atau mencabut internet saya, proses server langsung berhenti.

Apakah ada yang harus saya lakukan di Putty?


Edit 2 (pada Feb, 2012)

Ada node.jsmodul, selamanya . Ini akan menjalankan server node.js sebagai layanan daemon.

murvinlai
sumber
7
Dalam kasus saya, nohup berfungsi ketika saya keluar dari Terminal dengan mengetik exit. Ketika saya hanya menutup jendela Putty gagal.
Pawel Furmaniak

Jawaban:

513

Solusi sederhana (jika Anda tidak tertarik untuk kembali ke proses, hanya ingin tetap berjalan):

nohup node server.js &

Ada juga jobsperintah untuk melihat daftar proses-proses yang di-background. Dan Anda dapat membunuh proses latar belakang dengan menjalankan kill %1atau kill %2dengan nomor tersebut menjadi indeks dari proses tersebut.

Solusi hebat (memungkinkan Anda terhubung kembali ke proses jika interaktif):

screen

Anda kemudian dapat melepaskan dengan menekan Ctrl + a + d dan kemudian melampirkan kembali dengan menjalankan screen -r

Juga pertimbangkan alternatif yang lebih baru untuk layar, tmux.

MK.
sumber
1
Jadi, jika saya menjalankan "layar", saya membuat layar dan berlari di dalamnya, kan?
murvinlai
30
ya dan kemudian Anda dapat melepaskan dengan menekannig Ctrl + a, d dan kemudian melampirkan kembali dengan menjalankan layar -r
MK.
1
@murvinlai EC2 adalah lingkungan dan tidak ada hubungannya dengan hak akses root. Mungkin tentang AMI Anda. Misalnya dengan Amazon AMI Anda tentu bisa sudo bash.
ShuaiYuan
1
man bash: Jika perintah diakhiri oleh operator kontrol &, shell mengeksekusi perintah di latar belakang dalam sebuah subkulit. Shell tidak menunggu perintah selesai, dan status pengembalian adalah 0.
MK.
34
Silakan, kepada siapa pun yang membaca ini: menjalankan server node.js dalam layar atau sesi tmux adalah amatir solusi! Jangan lakukan itu, kecuali untuk tes cepat. Agar proses tetap berjalan, Anda perlu melakukan daemonisasi ! Gunakan alat yang tepat untuk itu, seperti selamanya , pm2 atau skrip init.d tua polos .
Victor Schröder
1119

nohup node server.js > /dev/null 2>&1 &

  1. nohupberarti: Jangan menghentikan proses ini bahkan ketika stty terputus.
  2. > /dev/nullberarti: stdout menuju / dev / null (yang merupakan perangkat dummy yang tidak merekam output apa pun).
  3. 2>&1berarti: stderr juga masuk ke stdout (yang sudah dialihkan ke /dev/null). Anda dapat mengganti & 1 dengan jalur file untuk menyimpan log kesalahan, misalnya:2>/tmp/myLog
  4. &pada akhirnya berarti: jalankan perintah ini sebagai tugas latar belakang.
Yoichi
sumber
49
Ini harus menjadi jawaban yang diterima, karena kualitasnya jauh lebih tinggi daripada yang diterima saat ini.
L0j1k
2
@ L0j1k dapat diperdebatkan, OP telah menunjukkan tingkat pemahaman bahwa diperlukan penjelasan lebih lanjut untuk jawaban yang diterima.
JFA
41
SO bukan tentang OP, melainkan tentang ribuan orang yang datang ke OP untuk meminta bantuan.
L0j1k
3
Apakah perlu untuk mengarahkan ulang stdout dan stderr? Apakah ini akan berhasil jika saya tidak mengarahkan mereka sama sekali? Atau jika saya mengarahkan mereka ke file saja?
Shawn
10
Kirim stdout DAN stderr ke /dev/null? Pencatatan yang bagus ... Semoga berhasil mencoba men-debug ini ...
Victor Schröder
138

Anda benar-benar harus mencoba menggunakannya screen. Ini sedikit lebih rumit dari sekadar melakukan nohup long_running &, tetapi memahami layar begitu Anda tidak pernah kembali lagi.

Mulailah sesi layar Anda terlebih dahulu:

user@host:~$ screen

Jalankan apa pun yang Anda inginkan:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Tekan ctrl + A dan kemudian d. Selesai Sesi Anda terus berlangsung di latar belakang.

Anda dapat mendaftar semua sesi dengan screen -ls, dan melampirkan ke beberapa dengan screen -r 20673.pts-0.srvperintah, di mana 0673.pts-0.srv adalah daftar entri.

Alex Povar
sumber
125

Ini adalah pertanyaan lama, tetapi berperingkat tinggi di Google. Saya hampir tidak bisa percaya pada jawaban dengan suara terbanyak, karena menjalankan proses node.js di dalam sesi layar, dengan &atau bahkan dengan nohupbendera - semuanya - hanyalah solusi.

Khususnya solusi layar / tmux, yang harus benar-benar dianggap sebagai solusi amatir . Layar dan Tmux tidak dimaksudkan untuk menjaga proses berjalan, tetapi untuk sesi terminal multiplexing. Tidak apa-apa, ketika Anda menjalankan skrip di server Anda dan ingin memutuskan sambungan. Tetapi untuk server node.js Anda tidak ingin proses Anda dilampirkan ke sesi terminal. Ini terlalu rapuh. Agar semuanya tetap berjalan, Anda perlu melakukan daemonisasi proses!

Ada banyak alat bagus untuk melakukannya.

PM2 : http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

Satu keuntungan besar yang saya lihat mendukung PM2 adalah dapat menghasilkan skrip startup sistem untuk membuat proses bertahan di antara restart:

$ pm2 startup [platform]

Di mana platformbisa ubuntu|centos|redhat|gentoo|systemd|darwin|amazon.

forever.js : https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

Skrip init :

Saya tidak masuk ke detail tentang bagaimana menulis skrip init, karena saya bukan ahli dalam hal ini dan itu akan terlalu lama untuk jawaban ini, tetapi pada dasarnya mereka adalah skrip shell sederhana, dipicu oleh peristiwa OS. Anda dapat membaca lebih lanjut tentang ini di sini

Docker :

Jalankan saja server Anda dalam wadah Docker dengan -dopsi dan, ya ampun , Anda memiliki server node.js yang terubah!

Berikut ini adalah contoh Dockerfile (dari panduan resmi node.js ):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

Kemudian buat gambar Anda dan jalankan wadah Anda:

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

Semoga ini bisa membantu seseorang mendarat di halaman ini. Selalu gunakan alat yang tepat untuk pekerjaan itu. Ini akan menghemat banyak sakit kepala dan berjam-jam!

Victor Schröder
sumber
2
Ini yang saya cari. Dengan solusi PM2, apakah ada cara untuk memasang terminal nanti?
Quantumplation
4
@ Quantumplation, tidak. Itu tidak mungkin karena prosesnya tidak berjalan dalam sesi interaktif. Tetapi Anda dapat memiliki "perasaan" yang sama dengan tail -fmemasukkan file log yang dihasilkan PM2.
Victor Schröder
1
Anda menentukan screensolusi yang banyak orang temukan melakukan pekerjaan adalah solusi. Ada banyak cara untuk mencapai tugas tertentu. Saya percaya itu terjadi bahwa (pertimbangkan pertanyaan spesifik) itu terjadi untuk mencapai tugas khusus run as background and never dieuntuk banyak orang. Ini juga memiliki bonus tambahan yang memungkinkan pengguna untuk kembali ke dalamnya untuk berinteraksi kembali dan membuat perubahan jika dia mau. Kuncinya adalah komponen backgrounddan never die. Semua solusi memiliki bonus tertentu.
LD James
@Rakshith Ravi - Saya tidak setuju. Semua ini memerlukan unduhan / perangkat lunak / alat tambahan (kecuali solusi init, yang tidak diberikan solusi). The nohup adalah solusinya. Ini dipanggang di Linux, dan memang untuk apa. Ini satu baris, bersih, dan berfungsi sebagaimana mestinya, setiap kali, terlepas dari pembaruan. Orang-orang harus benar-benar berusaha menghindari penggunaan alat pihak ketiga untuk kasus penggunaan dasar seperti ini. Contoh buruh pelabuhan (misalnya) jauh lebih verbose dan sumber daya intensif daripada satu perintah sederhana di jawaban pilihan teratas. Love Docker, tetapi tidak untuk ini.
Jack_Hu
1
@Jack_Hu, saya tidak ragu tentang overhead, tetapi nohupsolusinya tidak memenuhi persyaratan "tidak pernah mati". Kecuali jika Anda menulis traploop yang sangat rumit atau tak beraturan, saya tidak melihat bagaimana cara menjaga proses tetap dihidupkan tanpa menggunakan alat yang ditulis khusus untuk tujuan ini (atau skrip init yang ditulis sendiri, tentu saja).
Victor Schröder
24

solusi lain tidak mengakui pekerjaan itu

$ nohup node server.js &
[1] 1711
$ disown -h %1
myururdurmaz
sumber
tolak adalah apa yang saya cari, tapi apa yang dilakukan flag -h? Saya tidak bisa menemukannya di manual
Rimantas Jacikevicius
dari halaman manual: Jika opsi -h diberikan, setiap jobspec tidak dihapus dari tabel, tetapi ditandai sehingga SIGHUP tidak dikirim ke pekerjaan jika shell menerima SIGHUP. Jika tidak ada jobspec yang disediakan, opsi -a berarti menghapus atau menandai semua pekerjaan;
myururdurmaz
14

nohupakan memungkinkan program untuk melanjutkan bahkan setelah terminal mati. Saya benar-benar mengalami situasi di mana nohupsesi SSH tidak berhenti dengan benar, jadi Anda juga harus mengarahkan ulang input:

$ nohup node server.js </dev/null &

Tergantung pada bagaimana nohupdikonfigurasi, Anda mungkin juga perlu mengarahkan output standar dan kesalahan standar ke file.

Daniel Gallagher
sumber
7

Saya memiliki fungsi ini di file shell rc saya, berdasarkan jawaban @ Yoichi:

nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    nohup "$1" > /dev/null 2>&1 &
}

Anda dapat menggunakannya dengan cara ini:

nohup-template "command you would execute here"
thiagowfx
sumber
7

Nohup dan layar menawarkan solusi cahaya yang hebat untuk menjalankan Node.js di latar belakang. Node.js process manager ( PM2 ) adalah alat yang berguna untuk penyebaran. Instal dengan npm secara global di sistem Anda:

npm install pm2 -g

untuk menjalankan aplikasi Node.js sebagai daemon:

pm2 start app.js

Anda dapat menautkannya secara opsional ke Keymetrics.io, SAAS pemantauan yang dibuat oleh Unitech.

Donald Derek
sumber
6
$ disown node server.js &

Ini akan menghapus perintah dari daftar tugas aktif dan mengirim perintah ke latar belakang

Skynet
sumber
5

Sudahkah Anda membaca tentang perintah nohup ?

S.Lott
sumber
3

Untuk menjalankan perintah sebagai layanan sistem pada debian dengan sysv init:

Salin skrip skrip dan sesuaikan untuk kebutuhan Anda, mungkin yang harus Anda lakukan adalah mengatur beberapa variabel. Skrip Anda akan mewarisi dari default baik-baik saja /lib/init/init-d-script, jika ada sesuatu yang tidak sesuai dengan kebutuhan Anda - timpa dalam skrip Anda. Jika terjadi kesalahan, Anda dapat melihat detail di sumber /lib/init/init-d-script. Vars wajib adalah DAEMONdan NAME. Script akan digunakan start-stop-daemonuntuk menjalankan perintah Anda, karena START_ARGSAnda dapat menentukan parameter tambahan start-stop-daemonuntuk digunakan.

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

Begitulah cara saya menjalankan beberapa hal python untuk wikimedia wiki saya:

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

Selain menetapkan vars saya harus menimpa do_stop_cmdkarena pengganti python executable, sehingga layanan tidak berhenti dengan benar.

pengguna3132194
sumber
3

Terlepas dari solusi keren di atas, saya akan menyebutkan juga tentang alat pengawas dan monit yang memungkinkan untuk memulai proses, memantau keberadaannya dan memulainya jika mati. Dengan 'monit' Anda juga dapat menjalankan beberapa pemeriksaan aktif seperti memeriksa apakah proses merespons permintaan http

Krzysztof Księżyk
sumber
3

Untuk Ubuntu saya menggunakan ini:

(exec PROG_SH &> / dev / null &)

salam

David Lopes
sumber
Poin minor: 'exec' tidak diperlukan jika PROG_SH adalah executable. Inti dari solusi yang diusulkan oleh David adalah untuk melepaskan anak dari cangkang berjalan saat ini. Orang tua anak menjadi 'pid 1' dan tidak akan terpengaruh ketika shell berakhir.
SoloPilot
0

Coba ini untuk solusi sederhana

cmd & keluar

Hunter Frazier
sumber